类型定义和类型别名
- 类型定义:
type byte=uint8 - 类型别名:
type myInt int
命名类型
- 具有名称的类型,例如:
int,int64,float32,string,bool - 通过类型声明创建的所有类型都是命令类型
- 一个命名类型一定和其他类型不同
未命名类型
- 组合类型:数组,结构体,指针,函数,接口,切片,map和通道
- 虽然他么没有名字,但却有一个类型字面量来描述他们由什么构成
类型字面量:字面量(literal)是用于表达源代码中一个固定值的表示法(notation)
基础类型
- 任何类型T都有基本类型
- 如果T 是预先声明类型:boolean, numeric, or string(布尔,数值,字符串)中的一个,或者是一个类型字面量(type literal),他们对应的基础类型就是T自身。
- 否则,T的基础类型就是 T所引用的那个类型的类型声明(type declaration)
type A string // string
type B A // string
type M map[string]int // map[string]int
type N M // map[string]int
type P *N // *N
type S string // string
type T map[S]int // map[S]int
type U T // map[S]int
- 1和6是预先声明类型,他们的基础类型就是T自身
- 3和5是类型字面量,基础类型也是T自身
- 2,4,8:基础类型就是引用额类型的类型声明
- 9因为基础类型只追溯到它的未命名类型的最外层(或者就像说明上说的:如果T是一个类型字面量,它的基础类型就是T自身),所以U的基础类型是map[S]int
可赋值性
当赋值时:
双方应该具有相同的基础类型,而且其中至少有一个不是命名类型(至少有一个是未命名变类型)。
- i 基础类型是int,ai基础类型也是int,但是因为两者没有一个是未命名类型,不能赋值
package main
import "fmt"
type aInt int
func main() {
var i int = 10
var ai aInt = 100
i = ai
printAiType(i)
}
func printAiType(ai aInt) {
fmt.print(ai)
}
- m是未命名类型,MyMap是命名类型,然后两个基础数据类型都是map[int]int
package main
import "fmt"
type MyMap map[int]int
func main() {
m := make(map[int]int)
var mMap MyMap
mMap = m
printAiType(mMap)
fmt.Print(m)
}
func printAiType(mMap MyMap) {
fmt.print(mMap)
}
- 类型转换:Meter和Centimeter基础数据类型都是int类型,可以互相转换
package main
type Meter int64
type Centimeter int32
func main() {
var cm Centimeter = 1000
var m Meter
m = Meter(cm)
print(m)
cm = Centimeter(m)
print(cm)
}
- 类型一致性
- 一个命令类型一定和其他类型都不同
- 如果基础类型的字面量在结构上是等价的,他们就是相同的类型
- 结构体基础数据类型 int64和int32不是同一类型,不可转换
package main
type Meter struct {
value int64
}
type Centimeter struct {
value int32
}
func main() {
cm := Centimeter{
value: 1000,
}
var m Meter
m = Meter(cm)
print(m.value)
cm = Centimeter(m)
print(cm.value)
}
- 结构体 基础数据类型都是int64 可以转换
package main
type Meter struct {
value int64
}
type Centimeter struct {
value int64
}
func main() {
cm := Centimeter{
value: 1000,
}
var m Meter
m = Meter(cm)
print(m.value)
cm = Centimeter(m)
print(cm.value)
}
本文深入探讨了Go语言中的类型定义与别名的概念,解析了命名类型与未命名类型的区别,并详细阐述了基础类型、可赋值性及类型转换的原则。此外,还通过具体示例解释了不同类型之间的转换条件。
554

被折叠的 条评论
为什么被折叠?



