Golang底层类型

时间:2015-03-29 18:11:51

标签: types go

在规范

的此代码段中
type T1 string
type T2 T1
type T3 []T1
type T4 T3

规范说:

  

字符串的基础类型T1T2string   []T1T3T4的基础类型为[]T1

为什么T2的基础类型不是T1,而是string? 如果T4的基础类型为[]string,那么[]T1的基础类型不应该是T1而不是string吗? 困惑。

1 个答案:

答案 0 :(得分:3)

spec mentions

  

每个类型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} })。

请参阅this example on playground

[]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)