Go数据类型

本文详细介绍了Go语言中的数据类型,包括float32的底层原理,其将小数转换为二进制的过程,并指出float64的存储结构。此外,还探讨了字符串类型,特别是UTF8编码在存储汉字时的字节使用情况。同时,文章列举了字符串与各种int类型之间转换的函数用法。最后,解答了关于变量默认数据类型及查看变量占用字节数的问题。
摘要由CSDN通过智能技术生成

Go数据类型

支持更新…
在这里插入图片描述

1 go语言中的数据类型

(1)float32类型底层原理

浮点数:小数点可以浮动的数,称为浮点数。与浮点数对应的还有定点数,也就是小数点不能浮动的数。

举例:以100.23为例,如果存储成定点小数,此时如果小数点位置放错了,成了这样:1.0023,则最后的结果肯定错了。如果是浮点数,则小数点可以随意移动,可以表示成科学计数法的形式:1.0023*102,在计算中,数字都是2的正数幂表示,所以计算机中的表示方法一般都是某个小数乘以2k。

float32如何如何将一个小数转成二进制数:

  • 整数部分:就和普通十进制数转成二进制数一样
  • 小数部分:让小数部分乘以2,如果得到的结果小于1,则继续乘以2,如果结果大于1,则将结果减去1再继续乘以2,直到结果刚好等于1为止,然后去每次乘积结果的整数部分的值为最终的二进制表示

小数转成二进制数示例:
在这里插入图片描述

float32的底层存储将一个小数分成符号部分+指数部分+尾数部分存储:

在这里插入图片描述

其中

  • sign表示符号位,1表示负数,0表示正数
  • exponent表示指数位,指定了⼩数点在数据中的位置,指数可以是负数,也可以是正数,指数位的⻓度越⻓则数值 的表达范围就越⼤;
  • fraction表示尾数位,⼩数点右侧的数字,也就是⼩数部分,⽐如⼆进制 1.0011 x 2^(-2),尾数部分就是 0011, ⽽且尾数的⻓度决定了这个数的精度,因此如果要表示精度更⾼的⼩数,则就要提⾼尾数位的⻓度;

float64的底层存储如下:

  • 符号位:1位
  • 指数位:11位
  • 尾数位:52位

(2)string类型

go语言中,采用UTF8编码技术、Unicode编码。

UTF8是一种编码技术,除了UTF8之外、还有UTF16(使用2个字节或4个字节表示每个Unicode字符码点)、UTF32(4个字节表示每个Unicode字符码点)等。

相对于UTF-16和UTF-32方案,UTF-8方案的空间利用率也是最高的。并且,utf8解码和编码时,也无需考虑字节序问题。

以字符“中”为例,它的码点(序号)为U+4E2D,它在Utf8编码则为“0xE4 0xB8 0xAD”,即在内存中Go实际用三个字节来表示“中”这个Unicode字符。

问:UTF8编码使用几个字节存储Unicode编码呢?

答:

  • 前128个与ASCII字符重合的码点(U+0000~U+007F)使用1个字节表示;
  • 带变音符号的拉丁文、希腊文、西里尔字母、阿拉伯文等使用2个字节来表示;
  • 而东亚文字(包括汉字)使用3个字节表示;
  • 其他极少使用的语言的字符则使用4个字节表示

(3)字符串和各种int类型之间的相互转换方式

  • string转成int

    int, err := strconv.Atoi(string)
    
  • string转成int64

    int64, err := strconv.ParseInt(string, 10, 64)
    
  • string转成uint64

    uint64, err := strconv.ParseUint(string, 10, 64)
    
  • int转成string

    string := strconv.Itoa(int)
    
  • int64转成string

    string := strconv.FormatInt(int64, 10)
    
  • uint64转成string(10进制)

    string := strconv.FormatUint(uint64, 10)
    
  • uint64转成string(16进制)

    string := strconv.FormatUint(uint64, 16)
    

(4)FAQ

var a = 100

问:上面代码中,变量a属于什么数据类型?是intint8int16int32还是int64

答:变量a默认是int数据类型。

问:如何查看变量作占用的字节数?

答:

import "unsafe"

func main () {
 bytesOfVariable := unsafe.Sizeof(variable)
}
var a = 1.1

问:上面的代码中,变量a是什么数据类型?

答:go语言中,上面的代码,变量a默认是float64数据类型的

Reference

  1. https://blog.51cto.com/u_15076234/4119416
  2. Go字符串比较,终于有人讲清楚了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值