1. 写在前面
st2StructTestprintDatast3StructTest2printData
package main
import "fmt"
type StructTest struct{
data string
}
func (st StructTest) printData() {
fmt.Println(st.data)
}
type StructTest2 struct {
data string
}
func (st *StructTest2) printData(){
fmt.Println(st.data)
}
func main() {
st1 := StructTest{data: "seafooler"}
st1.printData()
st2 := &(StructTest{data: "seafooler"})
st2.printData()
st3 := StructTest2{data: "seafooler"}
st3.printData()
st4 := &(StructTest{data: "seafooler"})
st4.printData()
}
2. 自动“取引用”或“解引用”遇到“接口”
2.1 现象
InterfaceTestStructTestStructTest2mainprintDatait3
package main
import "fmt"
type InterfaceTest interface {
printData()
}
type StructTest struct {
data string
}
func (st StructTest) printData() {
fmt.Println(st.data)
}
type StructTest2 struct {
data string
}
func (st *StructTest2) printData() {
fmt.Println(st.data)
}
func main(){
st := StructTest{data: "seafooler"}
var it1 InterfaceTest = st
it1.printData()
var it2 InterfaceTest = &st
it2.printData()
st2 := StructTest2{data: "seafooler"}
var it3 InterfaceTest = st2 // 编译出错
it3.printData()
var it4 InterfaceTest = &st2
it4.printData()
}
2.2 原因
原因是因为,对于一个类来说,其值类型的方法会自动生成相应的指针类型的方法,而指针类型的方法不会自动生成相应的值类型的方法。在我们的程序示例中:
StructTestprintDatafunc (st *StructTest) printData()*StructTestInterfaceTestStructTest2printDatafunc (st StructTest2) printData()StructTest2InterFaceTestst2it3
3. 总结
我们在谈到变量的自动“取引用”和“解引用”时,往往是指在进行“方法调用”的时候。而第2部分的示例代码中,涉及到类型的匹配,那就是另外一个问题了,涉及到的是新的相应方法的生成。值类型的方法总会生成一个对应的指针类型方法,反之则不可以。