```go
type A struct {
r int
}
func (a A) FuncA() {}
type B A
type C *A
func main() {
var b B
var a A
var c C
a.FuncA() //legal
b.FuncA() //illegal
c.FuncA() //illegal
(*c).FuncA() //legal
fmt.Println(b.r) //legal
fmt.Println(c.r) //legal
}
```
为什么b.FuncA() 和 c.FuncA() 不合法,而(*c).FuncA(),b.r和c.r合法呢?
我个人理解,仅供参考:
1. type B A 定义的是一个新类型,但是 B 和 A 的底层类型是一样的(这部分参考圣经),即它们都是拥有 r 这个成员的结构体,因此 b.r 和 c.r 合法
2. b 和 c 无法调用 FuncA() 是因为它们都是新类型并且没有绑定该方法
3. 当添加以下代码 `b = *c` ,ide 提示 **type A** 类型无法赋值给 **type B**,所以此时 `*c` 可以调用方法,至于为什么 *c 是 type A 类型,这点我也不太清楚。
#1
更多评论