Go圣经-类型转换
Go语言中的类型转换有四种
显示转换:强制转换
隐式转换:数值的初始化赋值传参时会完成,或者接口结构体的使用中
类型断言:接口的类型断言,必须时接口
Unsafe.pointer:–
显示转换
go1
2
3//最简单的
var a int
//设置了a的类型为int 哈哈哈go1
2
3
4
5// 同类型的转换 数字类型之间的转换,切片和字符串的转换是允许的
var a int64
var b int32
fmt.Println("Type(a) = %T, Type(b) = %T \n",a,int64(b))go1
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包,具体使用看官方文档隐式转换
传统初始化赋值编译器就会自动实现转换
a := 1 a自动被认为是 int
- 在Go中,如果一个结构体满足一个接口的所有方法,该类型的实例可以自动转化为接口类型
go1
2
3
4
5
6
7
8
9
10
11
12
13
14
15type 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
go1
2
3
4
5
6var 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: 可以指向任意类型的指针,不能进行计算,不能读取内存存储的值
详细情况查文献。
文档查询:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Echin の 博客!