前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go(golang)中的类型转换

go(golang)中的类型转换

作者头像
李海彬
发布2018-03-28 11:08:54
2.3K0
发布2018-03-28 11:08:54
举报
文章被收录于专栏:Golang语言社区Golang语言社区
在使用 go 这样的强类型语言时,我们常常会遇到类型转换的问题。比如 int 类型转 int64,interface{} 转 struct ,对一种类型取指针、解指针等等。今天在这篇文章中我们就来梳理一下,我们在 go 的日常使用中常碰到的几个类型转换场景。

一、显式类型转换

这种类型转换主要在切换同一基础类型不同精度范围时使用,比如我们要将 int 型转为 int64 类型时。

代码语言:javascript
复制
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{} 的类型

代码语言:javascript
复制
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 的指针操作并不复杂,通过符号 & 、* 就能轻松的实现指针与其所对应值的切换。

代码语言:javascript
复制
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 ......

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档