go(golang)中的类型转换
一、显式类型转换
这种类型转换主要在切换同一基础类型不同精度范围时使用,比如我们要将 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 ......
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用@ConditionalOnProperty注解
- Java注解Annotation与自定义注解详解
- spring boot 配置多个DispatcherServlet
- 基于Pytorch实现的MASR中文语音识别
- Quartz.NET 配置文件详解
- 如何用redis正确实现分布式锁?
- SQL Server 事务隔离级别
- Django+Vue开发生鲜电商平台之8.商品详情页功能实现
- Django+Vue开发生鲜电商平台之7.用户登录和注册功能
- centos7下nginx使用tmp目录问题
- TeaWeb – 可视化的Web代理服务
- Slf4j适配日志原理
- vim编辑器
- 深度学习常用Linux命令
- Vlan 和 和 Trunk 实验