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。

。。。非常感谢。