我是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/

10-09 01:58