写点什么

【愚公系列】2022 年 7 月 Go 教学课程 012- 强制类型转换

作者:愚公搬代码
  • 2022 年 7 月 17 日
  • 本文字数:961 字

    阅读完需:约 3 分钟

前言

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 ok{    fmt.Println("float32",t2)  }}
复制代码



可见自动推断 a 是 int 类型。

二、类型转换

类型转换属于一种类型的变量转换为另外一种数据类型的变量。


package mainimport "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 mainimport "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 字符串


发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2022.03.01 加入

该博客包括:.NET、Java、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、python、大数据等相关使用及进阶知识。查看博客过程中,如有任何问题,皆可随时沟通。

评论

发布
暂无评论
【愚公系列】2022年7月 Go教学课程 012-强制类型转换_7月月更_愚公搬代码_InfoQ写作社区