我是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"})
}
所以问题是:
如何确保实施对象界面的人员会落入案例对象类型?
提前致谢。
答案 0 :(得分:2)
"问题"是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:
类型可能具有与之关联的方法集。 interface type的方法集是其接口。任何其他类型
T
的方法集由声明为接收器类型T
的所有methods组成。相应pointer type*T
的方法集是使用receiver*T
或T
声明的所有方法的集合(也就是说,它还包含{{1}的方法集}})。
请注意,当你像这样呼叫T
时幕后:
overload()
这会将overload(&someStruct{val: 5, some: "say"})
指针值包装在*someStruct
值中(因为interface{}
的参数为overload()
类型),而不是interface{}
类型的接口值{1}}。
在object
内,type switch将按所列顺序检查类型。当它达到overload()
时,它会看到case object
参数中包含的值确实实现了overLoadedObj
,因此将执行此案例。