我是golang的新手,我想实现类似于C++重载的重载方法,并且我的代码如下所示:
type someStruct struct {
val int
some string
}
type object interface {
toByte()
}
// someStruct implementing an object interface
func (s *someStruct) toByte() {
}
func overload(overLoadedObj interface{}) {
switch str := overLoadedObj .(type) {
case string:
fmt.Println("string : ", str)
case int:
fmt.Println("int : ", str)
case object: //* It doesn't come here at all*
fmt.Println("interface obj", str)
}
}
func main() {
overload("hello")
overload(5)
overload(someStruct{val: 5, some: "say"})
}
所以问题是:
如何确保实现对象接口(interface)的人都属于案例对象类型?
提前致谢。
最佳答案
“问题”是someStruct.toByte()
具有指针接收器。这意味着toByte()
方法属于*someStruct
类型,而不属于someStruct
。因此,someStruct
不实现object
,仅实现*someStruct
。然后将someStruct
的值传递给overload()
。
传递*someStruct
的值,您将获得所需的内容:
overload(&someStruct{val: 5, some: "say"})
输出(在Go Playground上尝试):
string : hello
int : 5
interface obj &{5 say}
规范中的相关部分:Method sets:
幕后花絮
请注意,在幕后调用
overload()
时,如下所示:overload(&someStruct{val: 5, some: "say"})
这会将
*someStruct
指针值包装在interface{}
值中(因为overload()
具有interface{}
类型的参数),而不是在object
类型的接口(interface)值中。在
overload()
内部,type switch将按照列出的顺序检查类型。当到达case object
时,它将看到包裹在overLoadedObj
参数中的值确实实现了object
,因此将执行这种情况。关于pointers - 是否可以将接口(interface)obj传递给interface {}类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38429683/