为什么没有为命名指针类型定义方法?

Sri*_*har 4 go

在有效的 Go文档中指出:

正如我们在 ByteSize 中看到的,可以为任何命名类型定义方法(指针除外......

type ByteSlice []byte
func (slice ByteSlice) Append(data []byte) []byte {
  // Body exactly the same as above
}
Run Code Online (Sandbox Code Playgroud)

然后它继续提供一个以指针作为接收器的示例:

func (p *ByteSlice) Append(data []byte) {
  slice := *p
  // Body as above, without the return.
  *p = slice
}
Run Code Online (Sandbox Code Playgroud)

这不矛盾吗?或者这是否意味着这是无效的:

type ByteSlice []byte
type Pb *ByteSlice
func (p Pb) Append(data []byte) []byte {
} 
Run Code Online (Sandbox Code Playgroud)

虽然它看起来就像一个 typedef!

Jim*_*imB 5

命名指针类型可能会导致歧义,如下所示:

type T int 

func (t *T) Get() T { 
    return *t + 1 
} 

type P *T 

func (p P) Get() T { 
    return *p + 2 
} 

func F() { 
    var v1 T 
    var v2 = &v1 
    var v3 P = &v1 
    fmt.Println(v1.Get(), v2.Get(), v3.Get()) 
}
Run Code Online (Sandbox Code Playgroud)

在最后一种情况下(尤其是v3根据当前规范),Get()应该调用哪个方法是不明确的。是的,没有理由不能定义方法解析,但对于已经有解决方案的语言来说,这是一个需要添加的又一个细节。