likes
comments
collection
share

Go基础-基础数据类型

作者站长头像
站长
· 阅读数 19

和其他的编程语言一样,Go语言中也有丰富的数据类型。有基本的整型、浮点型、布尔型、字符串类型,还有数组、切片、结构体、函数、map、通道(channel)等。

整形-int

按长度依次可分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64。其中,uint8就是我们熟知的byte型,int16对应C语言中的short(短整型)int64对应C语言中的long(长整型)

各种整形

下面是不同的位数整型对应的取值范围:

类型描述取值范围
uint8无符号 8位整型0 到 255
uint16无符号 16位整型0 到 65535
uint32无符号 32位整型0 到 4294967295
uint64无符号 64位整型0 到 18446744073709551615
int8有符号 8位整型-128 到 127
int16有符号 16位整型-32768 到 32767
int32有符号 32位整型-2147483648 到 2147483647
int64有符号 64位整型-9223372036854775808 到 9223372036854775807

可变长度整形

对于经常使用的 int,uintuintptr 这三个没有直接指定长度的整形类型。

我们需要注意的是:它们在不同的操作系统上的长度是不一样的,不能认为他们的长度是一致的。

类型描述
uint32位操作系统上就是uint32,64位操作系统上就是uint64
int32位操作系统上就是int32,64位操作系统上就是int64
uintptr无符号整型,用于存放一个指针

在实际使用中,slice、 map 或者是channel的的元素数量等都可以用int来表示。当有关于二进制传输、网络的编解码、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int和 uint

各种进制

在日常的使用中,十进制是最容易被我们理解的进制(逢十进一)。但是计算机的世界一般是二进制,偶尔会使用到八进制、十六进制。

v := 0b00101101, 代表二进制的 101101,相当于十进制的 45。

v := 0o377,代表八进制的 377,相当于十进制的 255。

v := 0x1p-2,代表十六进制的 1 除以 2²,也就是 0.25。

而且还允许我们用 _ 来分隔数字,比如说: v := 123_456 表示 v 的值等于 123456。

我们可以借助fmt函数来将一个整数以不同进制形式展示。

// 十进制
	var a int = 100
	fmt.Printf("%d \n", a) // 100
	fmt.Printf("%b \n", a) // 1100100  %b表示二进制

	// 八进制  以0开头
	var b int = 052
	fmt.Printf("%o \n", b) // 52

	// 十六进制  以0x开头
	var c int = 0xff
	fmt.Printf("%x \n", c) // ff
	fmt.Printf("%X \n", c) // FF

浮点类型-float

Go语言中间有两种浮点类型:float32float64,分别对应着单精度浮点和双精度浮点。

float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32

float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64

打印浮点数时,可以使用fmt包配合动词%f,代码如下:

package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Printf("%f\n", math.E)    // 2.718282
	fmt.Printf("%.2f\n", math.Pi) // 3.14
}

布尔类型-bool

布尔类型在Go语言中表示的是(true)(false)两个值,bool类型的默认值是false。

和其他语言不通的是:Go语言的布尔类型不可以从其他的整形转换过来,是有区别于其他类型的单独的类型。

package main

import "fmt"

func main() {

	var right bool

	if right {
		fmt.Println("it is right")
	} else {
		fmt.Println("bool type default value is false")
	}

}

字符串类型-string

Go 语言里的字符串的内部实现使用UTF-8编码, 字符串的值为双引号("")中的内容。

package main

func main() {
	var name = "丰丞秀儿"
	var title = "一个有趣的游戏设计师"
}

转义字符

转义字符一般在字符串中用于隔开一些特定的格式而增加的特定的字符类型。

比如说:”\n”表示新换一行。

Go 语言的字符串常见转义符包含引号、回车、换行、单双引号、制表符等,如下所示:

转义符号说明
\r回车符(返回行首)
\n换行符(直接跳到下一行的同列位置)
\t制表符
'单引号
"双引号
\反斜杠

字符型

组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号('')包裹起来,如:

var name = "丰丞秀儿"
var title = "一个有趣的游戏设计师"

其中每一个元素都是一个字符,比如说:’丰’ ,’丞’ , ’秀’ , ’儿’。

而在Go语言中,字符类型分为两种,分别是:

字符类型说明
byte 类型其实也是一个uint8类型,代表一个ASCII码字符
rune类型其实是一个int32类型,代表一个 UTF-8字符

当需要处理中文、日文、韩语等复合类型的字符时,则需要用到rune类型。Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便。

package main

import "fmt"

func main() {
	s := "丰丞秀儿"
	//byte
	for i := 0; i < len(s); i++ {
		fmt.Printf("%v(%c) ", s[i], s[i])
	}
	// 输出: 228(ä) 184(¸) 176(°) 228(ä) 184(¸) 158() 231(ç) 167(§) 128() 229(å) 132() 191(¿)
	fmt.Println()
	//rune
	for _, r := range s {
		fmt.Printf("%v(%c) ", r, r)
	}
	//输出:20016(丰) 19998(丞) 31168(秀) 20799(儿) 
}

因为UTF8编码下一个中文汉字由3~4个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。

字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的,字符串是由byte字节组成,所以字符串的长度是byte字节的长度。

rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

字符串的修改

要修改字符串,需要先将其转换成[]rune[]byte,完成后再转换为string,这种操作都会发生对象的复制,修改后的对象已经是另外一个内存地址的对象了。

package main

import "fmt"

func main() {
	s1 := "golang"
	// 强制类型转换
	byteS1 := []byte(s1)
	byteS1[0] = 'G'
	fmt.Println(string(byteS1))

	s2 := "丰丞秀儿"
	runeS2 := []rune(s2)
	runeS2[0] = '风'
	fmt.Println(string(runeS2))
}
转载自:https://juejin.cn/post/7141775920788045861
评论
请登录