文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

掌握Go语言的基本数据类型:编程世界的ABC

2024-12-13 14:44

关注

Go语言提供的基本数据类型

Go语言的基本数据类型可以分为以下几个类别:

  1. 整型:包括不同大小和符号的整数,如 int, int8, int16, int32, int64 和 uint 等。
  2. 浮点型:用于表示实数,包括 float32 和 float64。
  3. 布尔型:表示逻辑值 true 或 false。
  4. 字符串:用于表示文本数据,是一个不可变的字符序列。
  5. rune 类型:代表一个 Unicode 码点,等同于 int32。
  6. byte 类型:是 uint8 的别名,常用于表示字节。

int

定义int类型

var int1 = 1
fmt.Printf("int1类型:%T\n", int1)

输出结果:

int1类型:int

注意:%T 查看变量的类型

进制转化

var i1 = 101
fmt.Printf("%d\n", i1) //转成十进制
fmt.Printf("%b\n", i1) //把十进制转成二级制
fmt.Printf("%o\n", i1) //把十进制转成八进制
fmt.Printf("%x\n", i1) //把十进制转成十六进制
fmt.Println("-----")

输出结果:

数值为:101
把十进制转成二级制:1100101
把十进制转成八进制:145
把十进制转成十六进制:65

定义八进制

八进制一定是以0开头的,逢八进一位

i2 := 077
fmt.Printf("i2十进制:%d\n", i2)
fmt.Printf("i2八进制:%o\n", i2)
fmt.Printf("i2类型%T\n",i2)

输出结果

i2十进制:63
i2八进制:77
i2类型int

定义十六进制

从0到f,逢十六进一

i3 := 0x1234567
fmt.Printf("i3十进制:%d\n", i3)
fmt.Printf("i3十流进制:%x\n", i3)
// %T 查看变量的类型
fmt.Printf("i3十进制数据类型:%T\n", i3)

输出结果

i3十进制:19088743
i3十六进制:1234567
i3十进制数据类型:int

总结:我们发现直接定义十进制、八进制、十六进制的变量,变量的类型都是int型。

抛出问题

我们怎么定义int8/int16/int32/int64类型的数据呢?

其实非常简单:

i4 := int8(1)
i5 := int16(1)
i6 := int32(1)
i7 := int64(1)
fmt.Printf("i4:%T\n", i4)
fmt.Printf("i5:%T\n",i5)
fmt.Printf("i6:%T\n",i6)
fmt.Printf("i7:%T\n",i7)

输出结果:

i4:int8
i5:int16
i6:int32
i7:int64

抛出问题:go有这么多种int类型,我们怎么选择使用哪种呢?

给出答案:

我们首先要知道这些类型的区别:

其中int类型要重点说一下:go语言中的 int 的大小是和操作系统位数相关的,如果是32位操作系统,int 类型的大小就是4字节。如果是64位操作系统,int 类型的大小就是8个字节。

由此我们可以知道,根据自己需要的字节数来选择,当然选择int类型是最省心安全的,但是当我们取值范围小的时候,会浪费存储空间。

float

go中的float可以细分为:float32和float64

定义float

f1 := 1.0
fmt.Printf("f1类型:%T\n", f1) // Go语言中的小数默认类型是:float64

输出结果:

f1类型:float64

分析:在未指定类型定义float时,默认的类型是float64。和int类型的定义是一致的。

反思:这种设计我们也可以很好理解,出于数据安全的考虑,设置数据类型对应的最大内存空间的类型,避免内存溢出等问题。

定义float32类型

聪明的你一定会想到,和定义int8是一样的

f2 := float32(1.4321)
fmt.Printf("%T\n", f2)

输出结果:

f2类型:float32

小技巧

我们可以通过内置的Math函数,获得常用的数值,比如:

var maxFloat = math.MaxFloat32;
println(maxFloat)

输出结果:

+3.402823e+038

注意

在go中,数据类型是有严格的区分的,不同类型之间是不能互相转换的,比如:

图片

bool类型

定义

b1 := true
fmt.Printf("b1类型:%T\n", b1)

输出结果:

b1类型:bool

默认值为false

var b2 bool
// 前面有2个% 后面也要传2次参数
fmt.Printf("b2类型为:%T 值为: %v\n", b2, b2)

输出结果:

b2类型为:bool 值为: false

字符串

s1 := "123"
s2 := "我们"
s3 := "mystring"
s1 := '1'
s2 := '我'
s3 := 's'
// 字节:1个字节=8Bit(8个二进制位)
// 一个字符'A' = 1个字节
// 一个utf8编码的汉字一般占3个字节 (比如‘沙’)

rune

rune它是int32的别名(-2147483648~2147483647),相比于byte(-128~127),可表示的字符更多。由于rune可表示的范围更大,所以能处理一切字符,当然也包括中文字符。在平时计算中文字符,可用rune。

当我们数据中有中文时,一定要注意rune的处理。

len()详解

len()获得的是 byte 字节的数量,一个中文占用3个字节

s := "Hello王"
sHello := "Hello"
sWang := "王"
//len()获得的是 byte 字节的数量
fmt.Println(len(s))
fmt.Println(len(sHello))
fmt.Println(len(sWang))

输出结果是:8 5 3

循环输出字符串

s := "Hello王"
for i := 0; i < len(s); i++ {
   fmt.Printf("%c\n", s[i])
}

输出结果:

图片

我们发现英文可以正常输出,但是中文通过这种方式输出会乱码

循环输出中文字符串

我们可以通过for range循环,从字符串中拿出具体的字符

s := "Hello王"
for _, c := range s {
   fmt.Printf("%c\n", c) //%c 字符
}

输出结果:

图片

字符串的修改

字符串修改是不能直接修改的,需要转成rune切片后再修改

s2 := "小白兔"
s3 := []rune(s2)        //把字符串强制转成rune切片
s3[0] = '大'             //注意 这里需要使用单引号的字符,而不是双引号的字符串
fmt.Println(string(s3)) //把rune类型的s3强转成字符串

输出结果:大白兔

字符和字符串的区别

c1 := "红"
c2 := '红'                            
fmt.Printf("c1的类型:%T c2的类型:%T \n", c1, c2) 
c3 := "H"                            
c4 := 'H'                            
fmt.Printf("c3的类型:%T c4的类型:%T \n", c3, c4)

输出结果:

c1的类型:string c2的类型:int32 
c3的类型:string c4的类型:int32

总结:我们发现只要是双引号包裹的类型就是string,只要是单引号包裹的类型就是int32,也就是rune。和中英文无关。

知识点:rune的别名是int32

类型转换

n1 := 10
var f float64
f = float64(n1)
fmt.Printf("f的类型是:%T f的值是:%v\n", f,f)

输出结果:

f的类型是:float64 f的值是:10

总结

  1. Go语言中对类型有严格的要求,不同类型之间不能直接转换,哪怕int8/int16之间也不能转换。
  2. 声明变量同时赋值的方式,如果没有指定明确的数据类型,会默认使用范围大的类型,比如:int、float64、false。
  3. 字符串的修改要转成rune切片,而不能像PHP一样直接修改。

本文转载自微信公众号「王中阳Go」,作者「王中阳Go」,可以通过以下二维码关注。

转载本文请联系「王中阳Go」公众号。

来源:王中阳内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯