go(golang)中的类型转换

时间:2022-05-06
本文章向大家介绍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 ......