指针的类型别名何时与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,就真的值得这么做。