当前位置: 代码迷 >> 综合 >> golang-类型系统
  详细解决方案

golang-类型系统

热度:54   发布时间:2023-10-13 09:20:31.0
  1. 命名类型和未命名类型

    命名类型
    1)预声明类型(简单类型)
    布尔型(bool)、整型(int)、浮点型(float)、复数(complex)、字符(byte)、字符串(string)、接口(error)
    2)自定义类型(type声明)
    未命名类型(复合类型、类型字面量)
    数组(array)、切片(slice)、字典(map)、指针(pointer)、通道(channel)、结构(struct)、接口(interface)、函数(function)

  2. 底层类型

    1)预声明类型和未命名类型的底层类型是它本身
    2)自定义类型的是逐层递归向下寻找,直至是预声明类型或未命名类型为止

type T1 string  //底层类型为string
type T2 T1 //底层类型为string
type T3 []string //底层类型为[]string
type T4 T3 //底层类型为[]string
type T5 []T1 //[]T1是数组,属于未命名类型 所以T5底层类型为[]T1
type t6 t5 //底层类型为[]T1

注意:
T3、T4与T5、T6的底层类型不同

  1. 类型赋值
var a T1
var b T2=a

| a可以赋值给b必须满足如下条件之一:
1)T1和T2类型相同
2)T1和T2的底层类型相同,且至少有一个为未命名类型
3)T2是接口,T1是具体类型,T1方法集是T2方法集的超集(见后续)方法集
4)T1和T2是有相同元素类型的通道,且至少有一个为未命名类型
5)a为nil,T2是指针、函数、切片、字典、通道、接口中的一个
6)a是一个字面常量值|

type map1 map[string]string
type map2 map1
m1:=make(map[string]string,1)
var ma map2 = m1 //ma和m1的底层类型相同,且m1是未命名类型可以赋值
var mb map1 = ma //? 虽然ma和mb的底层类型相同,但是map1和map2都是自定义类型,因此不能赋值
  1. 类型强制转换

上面的错误案例可以通过强制类型转换实现

var mb map1=(map1)ma

x可以强制类型转换传递给T的条件:
1)x可以直接赋值给T类型的变量
2)x类型和T有相同的底层类型
3)如果x类型和T是指针类型,则指向的类型有相同的底层类型
4)x类型和T同为整型、浮点型或者复数类型(int8、int16)
5)x是整数值或者[]byte,T是string
6)x是一个字符串,T是[]byte或[]rune
5)和 6)是字节和字符串之间的强制转换

s:="aaa"
var a []byte =[]byte(s)
var b string =string(a)