Pointers 是否可以将接口obj传递给接口{}类型? 我是Gangon的新手,我想实现一个重载的方法,类似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"}) } overload(&someStruct{val: 5, some: "say"})
因此,问题是: 如何确保实现对象接口的人属于案例对象类型 提前感谢。问题是Pointers 是否可以将接口obj传递给接口{}类型? 我是Gangon的新手,我想实现一个重载的方法,类似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"}) } overload(&someStruct{val: 5, some: "say"}),pointers,go,types,interface,go-interface,Pointers,Go,Types,Interface,Go Interface,因此,问题是: 如何确保实现对象接口的人属于案例对象类型 提前感谢。问题是someStruct.toByte()有一个指针接收器。这意味着方法toByte()属于类型*someStruct,而不是someStruct。因此someStruct不实现object,只实现*someStruct。然后将someStruct的值传递给重载() 传递一个值*someStruct,您将得到您想要的: overload(&someStruct{val: 5, some: "say"}) 输出(在上尝
someStruct.toByte()
有一个指针接收器。这意味着方法toByte()
属于类型*someStruct
,而不是someStruct
。因此someStruct
不实现object
,只实现*someStruct
。然后将someStruct
的值传递给重载()
传递一个值*someStruct
,您将得到您想要的:
overload(&someStruct{val: 5, some: "say"})
输出(在上尝试):
规范中的相关章节:
类型可能有与其关联的方法集。方法集是它的接口。任何其他类型T
的方法集都由使用接收方类型T
声明的所有方法组成。相应的*T
的方法集是与接收方*T
或T
声明的所有方法集(也就是说,它还包含T
的方法集)
幕后
请注意,在幕后,当您像这样调用重载()
时:
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"})
}
overload(&someStruct{val: 5, some: "say"})
这将把*someStruct
指针值包装在接口{}
值中(因为重载()
有一个接口{}
类型的参数),而不是包装在对象
类型的接口值中
在
重载()
中,将按列出的顺序检查类型。当它到达case object
时,它将看到overLoadedObj
参数中包装的值实现了object
,因此将执行此case。。。。非常感谢。