在规范中的这段代码片段中
type T1 string
type T2 T1
type T3 []T1
type T4 T3
Run Code Online (Sandbox Code Playgroud)
规范说:
T1字符串 、和 的基础类型T2是string。、和
的基础类型是。[]T1T3T4[]T1
为什么底层类型是T2not T1, but string?
如果 的基础类型是 ,那么 的基础类型不T4应该是[]string和 not吗?
使困惑。[]T1T1string
该规范提到:
每种类型
T都有一个基础类型:如果T是预声明的布尔、数字或字符串类型之一,或者类型文字,则相应的基础类型就是T它本身。
否则,的基础类型是其类型声明中引用的T类型的基础类型T。
T2在其类型声明中引用T1,它具有基础类型string。
T2对于be的基础类型很重要string,因为它将有助于可分配性,其中
值 x 可分配给类型 T 的变量(“x 可分配给 T”)
x 的类型 V 和 T 具有相同的基础类型,并且 V 或 T 中至少有一个不是命名类型。
这在“ Golang:为什么我可以键入别名函数并在不进行转换的情况下使用它们? ”中也有详细介绍。
当谈到 的底层类型时T4,我们谈论的是底层未命名类型[]T1。
同样,可分配性规则表明您可以分配[]T1给 T4(因为[]T1不是命名类型):它的基础类型在第一个未命名类型 ( []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)
Run Code Online (Sandbox Code Playgroud)
输出:
t3='%+v' [a b]
t4='%+v' [a b]
t4='%+v' [c d]
Run Code Online (Sandbox Code Playgroud)
丹尼·里弗斯在评论中补充道:
为什么底层类型
T4等于[]T1,而不是[]string?的底层类型
T4被定义为 的底层T3,即底层 ([]T1),并且由于[]T1是类型文字,因此它是最底层的。
规范的语言很容易忽略类型文字(不仅仅是预先声明的类型)也被视为基础类型。