#yyds干货盘点#【愚公系列】2022年08月 Go教学课程 012-强制类型转换
source link: https://blog.51cto.com/u_15437432/5576246
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
go语言中分为类型转换(type conversion)、类型断言(type assertion)和指针类型转换。
一、类型断言
package main
import "fmt"
func main() {
var a interface{} =10
t,ok:= a.(int)
if ok{
fmt.Println("int",t)
}
t2,ok:= a.(float32)
if ok{
fmt.Println("float32",t2)
}
}
可见自动推断 a 是 int 类型。
二、类型转换
类型转换属于一种类型的变量转换为另外一种数据类型的变量。
package main
import "fmt"
func main() {
var a float32 = 5.6
var b int = 10
fmt.Println (a * float32(b))
}
代码段中的 float32(b) 就是第二种强制类型转换, 普通变量类型int,float,string 都可以使用 type (a)这种形式来进行强制类型转换。
这种类型转换是通过构造类的构造方法创建一个新类型对象。
三、指针类型转换
package main
import "unsafe"
import "fmt"
func main() {
var a int =10
var b *int =&a
var c *int64 = (*int64)(unsafe.Pointer(b))
fmt.Println(*c)
}
指针的强制类型转换需要用到unsafe包中的函数实现。
golang中的强制类型转换有三种语法形式,分别是 类型断言,类型转换,指针类型转换,语法上类型断言和指针类型转换和Java比较像。
注意点:低类型转换为高类型,保证精度。高类型转换为抵类型会丢失精度。具体的进度请看下面这张表。
类型 | 名称 | 长度 | 零值 | 说明 |
---|---|---|---|---|
bool | 布尔类型 | 1 | false | 其值不为真即为假,不可以用数字代表true或false |
byte | 字节型 | 1 | 0 | uint8别名 |
rune | 字符类型 | 4 | 0 | 专用于存储unicode编码,等价于uint32 |
int, uint | 整型 | 4或8 | 0 | 有符号32位或无符号64位 |
int8 | 整型 | 1 | 0 | -128~ 127, |
uint8 | 整型 | 1 | 0 | 0~ 255 |
int16 | 整型 | 2 | 0 | -32768 ~ 32767, |
uint16 | 整型 | 2 | 0 | 0 ~ 65535 |
int32 | 整型 | 4 | 0 | -2147483648到2147483647 |
uint32 | 整型 | 4 | 0 | 0到4294967295(42亿) |
int64 | 整型 | 8 | 0 | -9223372036854775808到9223372036854775807 |
uint64 | 整型 | 8 | 0 | 0到18446744073709551615 ( 1844京) |
float32 | 浮点型 | 4 | 0.0 | 小数位精确到7位 |
float64 | 浮点型 | 8 | 0.0 | 小数位精确到15位 |
complex64 | 复数类型 | 8 | ||
complex128 | 复数类型 | 16 | 64位实数和虚数 | |
uintptr | 整型 | 4或8 | 足以存储指针的uint32或uint64整数 | |
strina | 字符串 | "” | utf-8字符串 |
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK