内容简介:通过前面几篇教程,我们已经陆续介绍完了 Go 语言中的基本数据类型,分别是布尔类型、由于 Go 语言是强类型语言,所以类似以上这些操作是不允许的,必须要对变量进行强制类型转化才能通过运算符进行计算,下面,我们来看看在 Go 语言中如何实现不同数据类型之间的强制转化。关于数值类型之间的转化,我们前面在介绍运算符的时候已经提到过,在进行类型转化时只需要调用要转化的数据类型对应的函数即可:
通过前面几篇教程,我们已经陆续介绍完了 Go 语言中的基本数据类型,分别是布尔类型、 整型 、 浮点型 、 复数类型 、 字符串 和字符类型,和 PHP 一样,Go 语言也支持这些基本数据类型之间的转化,但是不是像 PHP 那种可以自动转化,比如下面这些语句在 PHP 中都是合法的:
$a = 1; $b = 1.1; $c = "学院君"; $d = true; $sum = $a + $b; // 将 $a 和 $b 相加,会自动将 $a 转化为浮点型,结果是 2.1 $sum = $a + $d; // 将 $a 和 $d 相加,会自动将 $d 转化为整型,结果是 2 $str = $c . $b; // 将 $b 和 $c 相连接,$b 会被转化为字符串,结果是「学院君1.1」
由于 Go 语言是强类型语言,所以类似以上这些操作是不允许的,必须要对变量进行强制类型转化才能通过运算符进行计算,下面,我们来看看在 Go 语言中如何实现不同数据类型之间的强制转化。
数值类型之间的转化
关于数值类型之间的转化,我们前面在介绍运算符的时候已经提到过,在进行类型转化时只需要调用要转化的数据类型对应的函数即可:
v1 := uint(16) // 初始化 v1 类型为 unit v2 := int8(v1) // 将 v1 转化为 int8 类型并赋值给 v2 v3 := uint16(v2) // 将 v2 转化为 uint16 类型并赋值给 v3
看起来很简单,不过需要注意,在有符号与无符号以及高位数字向低位数字转化时,需要注意数字的溢出和截断,比如我们看这个例子:
v1 := uint(-255)
由于 uint
是无符号整型,所以上述转化编译时会报错:
constant -255 overflows uint
我们将上述代码改造如下:
v1 := uint(255) v2 := int8(v1) // v2 = -1
由于 int8
能够表示的范围是 -128~127,255 超出其表示范围,所以,会截取后8位, v1
是一个无符号整型,后八位都是 1, int8
是一个有符号的整型,所以最高位作为符号位,因此转化后的数字 v2
是负数, 11111111
是这个负数的补码,它的原码是 10000001
(原码=补码的补码,正数的补码是自身,负数的补码是反码+1,具体可参考计算机基础理论中原码、反码、补码的概念),所以 v2 最终转化后的结果是 -1。
然后,我们再来看下整型和浮点型之间的转化,浮点型转化为整型时,小数位被丢弃:
v1 := 99.99 v2 := int(v1) // v2 = 99
将整型转化为浮点型时,比较简单,直接调用对应的函数即可:
v1 := 99 v2 := float64(v2)
数值和布尔类型之间的转化
目前 Go 语言不支持将数值类型转化为布尔型,你需要自己根据需求去实现类似的转化。
字符串和其他基本类型之间的转化
整型数据可以通过对应的 UTF-8 编码转化为对应的字符串:
v1 := 65 v2 := string(v1) // v2 = A v3 := 30028 v4 := string(v3) // v4 = 界
此外还可以将字节数组或者 rune
(Unicode 编码字符)数组转化为字符串:
v1 := []byte{'h', 'e', 'l', 'l', 'o'} v2 := string(v1) // v2 = hello v3 := []rune{0x5b66, 0x9662, 0x541b} v4 := string(v3) // v4 = 学院君
与 PHP 不同的是,Go 语言不支持将字符串类型强制转化为数值类型。
strconv 包
要实现类似 PHP 中字符串与其他基本数据类型之间的转化,可以通过 strconv 这个包提供的函数来实现:
v1 := "100" v2, err := strconv.Atoi(v1) // 将字符串转化为整型,v2 = 100 v3 := 100 v4 := strconv.Itoa(v3) // 将整型转化为字符串, v4 = "100" v5 := "true" v6, err := strconv.ParseBool(v5) // 将字符串转化为布尔型 v5 = strconv.FormatBool(v6) // 将布尔值转化为字符串 v7 := "100" v8, err := strconv.ParseInt(v7, 10, 64) // 将字符串转化为整型,第二个参数表示几进制,第三个参数表示最大位数 v7 = strconv.FormatInt(v8, 10) // 将整型转化为字符串,第二个参数表示几进制 v9, err := strconv.ParseUint(v7, 10, 64) // 将字符串转化为无符号整型,参数含义同 ParseInt v7 = strconv.FormatUint(v9, 10) // 将字符串转化为无符号整型,参数含义同 FormatInt v10 := "99.99" v11, err := strconv.ParseFloat(v10, 64) // 将字符串转化为浮点型,第二个参数表示精度 v10 = strconv.FormatFloat(v11, 'E', -1, 64) q := strconv.Quote("Hello, 世界") // 为字符串加引号 q = strconv.QuoteToASCII("Hello, 世界") // 将字符串转化为 ASCII 编码
关于 strconv
包的更多功能,请查看对应的包 API。
以上所述就是小编给大家介绍的《Go 语言函数式编程系列教程(七) —— 数据类型篇:基本数据类型之间的转化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 【数据类型】js的数据类型
- Python中不可变数据类型和可变数据类型
- 重学JS: 数据类型及类型检测
- JS专题之数据类型和类型检测
- 6. Go 语言数据类型:字典与布尔类型
- Redis 入门-数据类型:3 种特殊类型详解
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。