是否可以将接口obj传递给接口{}类型?

时间:2016-07-18 06:14:36

标签: pointers go types interface go-interface

我是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"})
}

所以问题是:

如何确保实施对象界面的人员会落入案例对象类型?

提前致谢。

1 个答案:

答案 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 *TT声明的所有方法的集合(也就是说,它还包含{{1}的方法集}})。

幕后花絮

请注意,当你像这样呼叫T时幕后:

overload()

这会将overload(&someStruct{val: 5, some: "say"}) 指针值包装在*someStruct值中(因为interface{}的参数为overload()类型),而不是interface{}类型的接口值{1}}。

object内,type switch将按所列顺序检查类型。当它达到overload()时,它会看到case object参数中包含的值确实实现了overLoadedObj,因此将执行此案例。