指针的类型别名何时与go中的其他类型等效?

指针的类型别名何时与go中的其他类型等效?,go,types,Go,Types,我一直在试图弄清楚为什么一行会编译,而另一行不会。。以下是一个提炼版本: type A *string type B *string func TakeStringPointer(a *string) { fmt.Println("something: %s\n", *a) } func TakeA(a A) { fmt.Println("something else: %s\n", *a) } func Sample() { aa := "asdf" va

我一直在试图弄清楚为什么一行会编译,而另一行不会。。以下是一个提炼版本:

type A *string
type B *string

func TakeStringPointer(a *string) {
    fmt.Println("something: %s\n", *a)
}

func TakeA(a A) {
    fmt.Println("something else: %s\n", *a)
}

func Sample() {
    aa := "asdf"
    var pA A
    var pB B
    var pString *string

    pA = &aa
    pB = &aa
    pString = &aa

    TakeStringPointer(pString)
    TakeStringPointer(pA)
    TakeStringPointer(pB)
    TakeA(pA)
    TakeA(pB) // Does not compile
    TakeA(pString) // Does compile 
}
据我所知,
TakeA(pB)
TakeA(pString)
要么都能用,要么都不能用

A value x is assignable to a variable of type T if:
x’s type is identical to T.
x’s type V and T have identical underlying types…
在go规范中。对我来说,我希望两者都能编译,因为
A
B
都有相同的底层类型。(或者,两者都不会,因为*string与A不同,因为我们有一个类型声明)

这是怎么回事

x的类型V和T具有相同的基础类型

你引用了规范,省略了重要部分。全文如下:

x的类型V和T具有相同的基础类型,并且V或T中至少有一个不是定义的类型。


您拥有的不是类型别名,而是已定义的类型。(其形式为
类型A=B
),因此采用定义类型
B
的函数不能采用定义类型
A
;它可以采用
B
,也可以采用
B
的基础类型。

首先,这不是别名。它是什么,它是什么,它是什么,它是什么?为什么它没有用呢?它一定要有用吗?我只是想弄明白为什么会这样啊,这正是我需要的,我应该仔细检查一下实际的规范,而不是某个地方的摘要。Go规范太棒了。Go是我使用过的第一种语言,它可以在一两个小时内阅读规范,一旦你掌握了教程中的基本知识和有效的Go,就真的值得这么做。