在规范
的此代码段中type T1 string
type T2 T1
type T3 []T1
type T4 T3
规范说:
字符串的基础类型
T1
和T2
为string
[]T1
,T3
和T4
的基础类型为[]T1
。
为什么T2
的基础类型不是T1
,而是string
?
如果T4
的基础类型为[]string
,那么[]T1
的基础类型不应该是T1
而不是string
吗?
困惑。
答案 0 :(得分:3)
每个类型
T
都有一个基础类型:如果T
是预先声明的布尔,数字或字符串类型或类型文字之一,则相应的基础类型为T
本身。
否则,T
的基础类型是T
在其类型声明中引用的类型的基础类型。
T2
在其类型声明中引用T1
,其基础类型为string
。
T2
的基础类型为string
非常重要,因为它有助于Assignability
值x可分配给T类型的变量(" x可分配给T")
x的类型V和T具有相同的基础类型,并且V或T中的至少一个不是named type。
这也在" Golang: Why can I type alias functions and use them without casting?"
中详述当谈到T4
的基础类型时,我们讨论的是基础未命名类型[]T1
。
同样,可分配性规则表明您可以将[]T1
分配给T4(因为[]T1
不是命名类型):其基础类型停在第一个未命名的类型({{1} })。
[]T1
输出:
var t3 T3 = []T1{"a", "b"}
fmt.Println("t3='%+v'", t3)
// var t4 T4 = []string{}
// cannot use []string literal (type []string) as type T4 in assignment
var t4 T4 = T4(t3)
fmt.Println("t4='%+v'", t4)
t4 = []T1{T1("c"), T1("d")}
fmt.Println("t4='%+v'", t4)