Go语言中的类型转换有四种

显示转换:强制转换

隐式转换:数值的初始化赋值传参时会完成,或者接口结构体的使用中

类型断言:接口的类型断言,必须时接口

Unsafe.pointer:–

  • 显示转换

    go
    1
    2
    3
    //最简单的
    var a int
    //设置了a的类型为int 哈哈哈
    go
    1
    2
    3
    4
    5
    // 同类型的转换  数字类型之间的转换,切片和字符串的转换是允许的
    var a int64
    var b int32
    fmt.Println("Type(a) = %T, Type(b) = %T \n",a,int64(b))

    go
    1
    2
    3
    4
    5
    6
    // 不同类型的转换   int ->string
    var a int64
    var b string
    b = strconv.Itoa(a)
    fmt.Println("a= %d , b= %c \n",a,int64(b))
    //不同类型的转换需要使用strconv包,具体使用看官方文档
  • 隐式转换

    1. 传统初始化赋值编译器就会自动实现转换

      a := 1 a自动被认为是 int

    1. 在Go中,如果一个结构体满足一个接口的所有方法,该类型的实例可以自动转化为接口类型
    go
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    type People interface {
    Say()
    }
    type Student struct{
    Name string
    }
    func (s Student) Say(){
    fmt.Println("My name is ",s.Name)
    }
    func main(){
    var p People = Student{"li si"} // 结构体自动转化为接口
    p.Say()
    }


  • 类型断言

    适用于接口,用来判断该接口的类型

    value , ok := interfaceValue.(Type)

    interfaceValue是一个接口类型的变量,Type是想要断言的类型

    if 断言成功 value = interfaceValue ok=true

    else value =0 ok = false

    go
    1
    2
    3
    4
    5
    6
    var val interface{} = 42
    if v,ok:= val.(int);ok{
    fmt.Println(v+100)
    }else{
    fmt.Printlen("val 不是 int 类型")
    }
  • Unsafe.pointer

    在go语言中有3类指针: 普通指针、uintptr、unsafe.Pointer。

    • 普通指针 (T): 存储类型T的对象的地址,可以使用&(取地址)(根据地址取值),但不可计算
    • uintptr:一个无符号的整型,可以保存一个指针地址,可以进行计算。uintptr无法持有对象,GC不把uintptr当指针,所以uintptr类型的目标会被回收
    • unsafe.Ponter: 可以指向任意类型的指针,不能进行计算,不能读取内存存储的值

    详细情况查文献。

文档查询:

go语言入门扩展

golang中的四种类型转换总结

Go 语言类型转换 |