【愚公系列】2022年07月 Go教学课程 012-强制类型转换
【摘要】 前言go语言中分为类型转换(type conversion)、类型断言(type assertion)和指针类型转换。 一、类型断言package mainimport "fmt"func main() { var a interface{} =10 t,ok:= a.(int) if ok{ fmt.Println("int",t) } t2,ok:= a.(float32) if o...
前言
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字符串 |
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)