Go 语言函数式编程系列教程(七) —— 数据类型篇:基本数据类型之间的转化

栏目: 编程语言 · 发布时间: 5年前

内容简介:通过前面几篇教程,我们已经陆续介绍完了 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 语言函数式编程系列教程(七) —— 数据类型篇:基本数据类型之间的转化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Algorithm Design Manual

The Algorithm Design Manual

Steven S Skiena / Springer / 2011-11-14 / GBP 55.07

....The most comprehensive guide to designing practical and efficient algorithms.... Written by a well-known algorithms researcher who received the IEEE Computer Science and Engineering Teaching Aw......一起来看看 《The Algorithm Design Manual》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具