go - 如何在实现接口的结构中运行函数?
问题描述
大家好,我有这个代码
package main
import (
"fmt"
"math"
)
func main(){
var structObj *Struct
Obj1 := Obj1{}
Obj2 := Obj2{}
structObj = New(&Obj1)
fmt.Println(structObj.name)
structObj = New(&Obj2)
fmt.Println(structObj.runFunc)
}
type IStruct interface {
Id() string
Name() string
Run() string
}
type Obj2 struct {
}
func (self *Obj2) Id() string {
return "Obj2Id"
}
func (self *Obj2) Name() string {
return "Obj2"
}
func (self *Obj2) Run() string {
return "Obj2 run func"
}
type Obj1 struct {
}
func (self *Obj1) Id() string {
return "Obj1id"
}
func (self *Obj1) Name() string {
return "Obj1"
}
func (self *Obj1) Run() string {
return "Obj1 run func"
}
type Function func() string
type Struct struct {
name string
runFunc Function
isCompleted bool
}
func New(impl IStruct) *Struct {
return &Struct{
name: impl.Name(),
runFunc: impl.Run,
isCompleted: false,
}
}
输出
Obj1
0x6f6e00
当我调用实现 IStruct 的结构的名称时,它可以工作,但是当我从结构中调用 runFunc 时,它返回十六进制地址,当我调用 runFuncs 时我应该怎么做才能运行。
我这里最后想知道的是,当我想使用实现某个接口的结构作为接口时,我给出了结构的地址,为什么会出现这种情况?
解决方案
你runFunc
的是一个函数。打印一个函数只是打印它的地址。
如果要打印其输出,则需要实际执行它:
fmt.Println(structObj.runFunc())
另一方面,name
是一个字符串,因此打印它的工作方式完全符合预期。
至于你的第二个问题,你需要调用New(&Obj1)
,因为实现接口的所有方法都使用指针接收器:(self *Obj1)
。
这意味着*Obj1
实现了接口,但Obj1
没有实现。如果您愿意,您可以将所有接收者更改为值接收者:(self Obj1)
您将能够调用New(Obj1)
推荐阅读
- express - CORS 仅阻止 localhost 请求
- regex - Postgres 函数将单词拆分为具有额外逻辑的数组
- java - 使用 Spring Web 服务为每个请求提供不同的 ClientInterceptor
- python - VSCode 没有为大型 Jupyter 笔记本文件运行内核(仅显示为 html)
- python - 从 Python 字典中的每个值中删除标点符号
- regex - Catchall Htacess 重定向排除某些字符串
- math - Ansible sum int 值到注册值
- linux - 仅使用 containerd 修剪容器映像(不带 Docker)
- firebase - 网站和应用程序之间的跨域跟踪
- javascript - Discord.js 票务系统 | 垃圾邮件问题