Go语言的类型系统分为命名类型、非命名类型、底层类型、动态类型和静态类型等。
命名类型
类型可以通过标识符来表示,这种类型称为命名类型。Go语言的基本类型中有20个预声明简单类型都是命名类型,Go语言还有一种命名类型——用户自定义类型。
未命名类型
一个类型由预声明类型、关键字和操作符组合而成,这个类型称为未命名类型。未命名类型又称为类型字面量。Go语言中的数组、切片、字典、通道、指针、函数字面量、结构和接口都属于类型字面量。
package main
import "fmt"
//使用type声明的是命名类型
type Person struct{
name string
age int
}
func main(){
//使用struct字面量声明的是未命名类型
a := struct{
name string
ange int
}{"andes",18}
fmt.Printf("%T\n",a)//struct{name string;age int}
fmt.Printf("%v\n",a)//{andes,18}
b := Person("tom",20)
fmt.Printf("%T\n",b)//main.Person
fmt.Printf("%v\n",b)//{andes,18}
}
底层类型
所以类型都有一个底层类型,其规则如下:
- 预声明类型和类型字面量的底层类型是它们自身
- 自定义类型
type newtype oldtype
中的newtype 的底层类型是逐层递归向下查找的,直到查到的oletype是预声明类型或类型字面量为止。
类型相同
1.两个命名类型相同的条件是两个类型声明的语句完全相同。
2. 命名类型和未命名类型永远不相同
3. 两个未命名类型相同的条件是它们的类型声明字面量的结构相同,并且内部元素的类型相同。
4. 通过类型别名语句声明的两个类型相同。(如type T1=T2
)
类型可直接赋值var b T2 = a
- T1和T2的类型相同
- T1和T2具有相同的底层类型,并且T1和T2里面至少有一个是未命名的类型。
- T2是接口类型,T1是具体类型,T1的方法集是T2方法集的超集
- T1和T2都是通道类型,他们拥有相同的元素类型,并且T1和T2中至少有一个是未命名类型
- a是预声明标识符nil,T2是pointer,function,slice,map,channel,interface类型中的一个
- a是一个字面常量值,可以用来表示类型T的值