什么时候指针的类型别名等价于 go 中的其他类型?

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


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 不同,因为我们有一个类型声明)。


这里发生了什么?


Helenr
浏览 181回答 1
1回答

白衣染霜花

x 的类型 V 和 T 具有相同的基础类型……您引用了规范并省略了重要部分。完整地,规范的那部分内容如下:x 的类型 V 和 T 具有相同的基础类型,并且 V 或 T 中的至少一个不是定义的类型。您拥有的不是类型别名,而是已定义的类型。(类型别名的形式type A = B。)因此,采用已定义类型 B的函数不能采用已定义类型A;它可以采用B,也可以采用B的基础类型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go