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。

本文分享自微信公众号 - 学院君的后花园(geekacademy)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java大数据

maven版SpringBoot的Hello World

1)新建maven项目,package方式为jar. 用archetype quick start.参考我视频目录下的SpringbootMaven项目。

16630
来自专栏Web技术布道师

【干货】PHP7强悍性能背后,zval的变化!

PHP7已经发布, 如承诺, 我也要开始这个系列的文章的编写, 主要想通过文章让大家理解到PHP7的巨大性能提升背后到底我们做了什么, 今天我想先和大家聊聊zv...

10810
来自专栏Web技术布道师

关于LNMP+Frp内网穿透环境下一个PHP程序运行超时的问题

一直想在内网穿透的环境下运行WordPress,但是由于WordPress的一个插件一直运行超时错误的问题未解决而作罢,这次有空调试一下,看看能否解决:

10410
来自专栏Web技术布道师

如何发挥出PHP7的高性能

一点PHP博客分享如何发挥出PHP7版本中的高性能,PHP7发布也有一段时间了,但是现在还有很多小伙伴还在用PHP5.6开发项目,有的小伙伴用了PHP7只是听说...

9710
来自专栏Web技术布道师

Fast Web Scraping With ReactPHP

Have you ever needed to grab some data from a site that doesn’t provide a public...

15010
来自专栏Web技术布道师

从PHP 5到PHP 7性能全评测(含未发布的JIT版PHP 8对比)

导读:PHP 是 Web 开发最常用的语言,每个大版本的更新都带来不少新特性和性能提升。特别是 PHP 7.0 的发布,带来 PHP 性能飞跃。本文作者对各个 ...

16910
来自专栏Web技术布道师

10年开发经验的PHPer老司机经验之谈

在PHP的coding之路上不经意间已走过了10余载,期间有幸结识了一些高手,谈及成功的经验,总结下来,主要有以下几点:

13020
来自专栏Web技术布道师

PHP的垃圾回收机制以及大概实现

垃圾回收,简称gc。顾名思义,就是废物重利用的意思。再说这个之前先接触一下内存泄露,大概意思就是申请了一块地儿拉了会儿屎,拉完后不收拾,那么那块儿地就算是糟...

14130
来自专栏复盘总结文章集合

JAVA通过URL链接获取视频文件信息(无需下载文件)

最近项目碰到一个大坑:APP上需要在获取视频列表时就获取视频的时长,但早期上传的时候数据库都没有保存这个数据,所以前段时间添加一个时长字段,在上传时手动输入视频...

60020
来自专栏Web技术布道师

【鸟哥】PHP7强悍性能背后,zval的变化!

PHP7已经发布, 如承诺, 我也要开始这个系列的文章的编写, 主要想通过文章让大家理解到PHP7的巨大性能提升背后到底我们做了什么, 今天我想先和大家聊聊zv...

11020

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励