Golang type

本文深入探讨了Go语言中的类型定义与别名的概念,解析了命名类型与未命名类型的区别,并详细阐述了基础类型、可赋值性及类型转换的原则。此外,还通过具体示例解释了不同类型之间的转换条件。

类型定义和类型别名

  • 类型定义: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)
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值