go(golang)中的类型转换
Posted Golang语言社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go(golang)中的类型转换相关的知识,希望对你有一定的参考价值。
在使用 go 这样的强类型语言时,我们常常会遇到类型转换的问题。比如 int 类型转 int64,interface{} 转 struct ,对一种类型取指针、解指针等等。今天在这篇文章中我们就来梳理一下,我们在 go 的日常使用中常碰到的几个类型转换场景。
一、显式类型转换
这种类型转换主要在切换同一基础类型不同精度范围时使用,比如我们要将 int 型转为 int64 类型时。
package todo
import "testing"
func Test(t *testing.T) {
foo := 12
var bar byte = 18
t.Logf(" foo + bar = %d", foo+int(bar))
}
// todo_test.go:10: foo + bar = 30
这种转换方式所使用的语法是 T( ... ) ,直接将变量放置在左侧指明了类型的小括号内。该类型转换要注意的是:类型被转换后是否会损失精度的问题,如果损失了精度是否会影响接下来的业务流程。
二、断言(assert)
断言,顾名思义就是果断的去猜测一个未知的事物。在 go 语言中,interface{} 就是这个神秘的未知类型,其断言操作就是用来判断 interface{} 的类型。
package todo
import "testing"
func Test(t *testing.T) {
var foo interface{} = 22
f, ok := foo.(int)
if !ok {
t.Log("Guess wrong ...")
}
t.Logf("The type is : %T", f)
}
// todo_test.go:13: The type is : int
断言的语法是 x.( T ),x 指的是类型为 interface{} 的变量,T 是我们断言它可能是的类型。该语法返回两个参数,第一个参数是 x 转化为 T 类型后的变量,第二个值是一个布尔值,若为true 则表示断言成功,false 则表示断言失败。是不是颇有云南赌石的韵味,看准一块石头,认定里面必是上好的翡翠,买下之后拿切割机切开,若恰是一片晶莹碧透,瞬间发财,若石头里面还是石头,额.... 自认倒霉喽。
通常为了提高程序的健壮性,我们会对第二个布尔参数做检查判断,如若判断失败,则做相应的处理。
三、取指针和解指针
go 保留了 C语言 的指针概念,但 go 的指针操作并不复杂,通过符号 & 、* 就能轻松的实现指针与其所对应值的切换。
package todo
import "testing"
type Person struct {
Name string
Age uint8
}
func Test(t *testing.T) {
p := Person{
Name: "bar",
Age: 7,
}
per := &p
t.Logf("The type of per is : %T \n", per)
t.Logf("After operation , type is : %T", *per)
}
// todo_test.go:18: The type of per is : *todo.Person
// todo_test.go:19: After operation , type is : todo.Person
通过这个简单了例子可见,& 符 可以轻松的将某类型 T 转化为 T 的指针类型(*T),*
符 可轻松实现解指针,将某一类型的指针转化为该指针指向的值的类型。
这是我从类型转换的角度,对 go 常见的类型转换做的一个总结。对于从前端转来学习 go 的同学,或者 node.js 等弱类型语言使用较多的同学,一定在编译时常遇到类型转换的困惑。希望这篇文章能够对大家学习和使用 go 语言有所裨益。
Happy coding ......
以上是关于go(golang)中的类型转换的主要内容,如果未能解决你的问题,请参考以下文章