2021-03-10 09:20:24
Go语言中常用的数据类型主要包括布尔类型、数字类型、字符串类型、指针类型、数组类型、结构体类型、slice类型、map类型,以下是详细介绍:
布尔类型
值范围:布尔类型的值只可以是true和false。
使用场景:经常和if语句混合使用,也可以和逻辑运算符&&(与)、||(或)、!(非)一起使用。
转换限制:Go中的布尔类型和数字类型不能相互转换,如果需要转换,需要自己封装方法。例如:
布尔值转数字:
func boolToInt(flag bool) int { if flag { return 1 } return 0}数字转布尔值:
func intToBool(num int) bool { return num != 0}数字类型
整数类型:
无符号整数:
uint8:无符号8位整型,范围0 ~ 255。
uint16:无符号16位整型,范围0 ~ 65535。
uint32:无符号32位整型,范围0 ~ 4294967295。
uint64:无符号64位整型,范围0 ~ 18446744073709551615。
uint:32位或64位无符号整型,具体位数取决于操作系统(32位系统为32位,64位系统为64位)。
uintptr:无符号整型,用于存放一个指针。
有符号整数:
int8:有符号8位整型,范围-128 ~ 127。
int16:有符号16位整型,范围-32768 ~ 32767。
int32:有符号32位整型,范围-2147483648 ~ 2147483647。
int64:有符号64位整型,范围-92233720368547755808 ~ 9223372036854775807。
int:32位或64位有符号整型,具体位数取决于操作系统(32位系统为32位,64位系统为64位)。
特殊整数类型:
byte:和uint8等价,是uint8的别名。
rune:和int32等价,用于表示Unicode字符。
浮点数类型:
float32:32位浮点数。
float64:64位浮点数。
复数类型:
complex64:32位实数和虚数。
complex128:64位实数和虚数。
字符串类型
编码:Go中的字符串统一采用UTF-8编码。
声明和初始化:
name := "张大鹏"fmt.Println(name)转义字符:字符串中可以存在转义字符,常见的有n(换行)、t(制表符)、"(双引号)等。例如:
name := "鲁迅说:"世上本没有路,走的人多了,也就成了路。""fmt.Println(name)拼接:Go中的字符串可以直接使用+加号做拼接,能够将多个字符串合并为一个字符串。例如:
a := "11"b := "22"c := a + bfmt.Println("你猜a和b相加,结果是多少?", c)取值和切片:
通过索引取值,例如s[0]。
通过切片取值,例如s[6:]。
通过len取到的是字符串的字节数,通过utf8.RuneCountInString(str)取到的才是字符串的字符个数。例如:
s := "hello张大鹏"fmt.Println("通过索引取字符串元素:", s[0])fmt.Println("通过切片取字符串元素:", s[6:])fmt.Println("获取字符串字节数", len(s))fmt.Println("获取字符串字符数", utf8.RuneCountInString(s))比较:字符串是可以比较的,比较的是字符串底层的Unicode编码值。例如:
a := "abc"b := "abd"fmt.Println([]rune(a))fmt.Println([]rune(b))fmt.Println(a > b)遍历:字符串是可以遍历的,不过如果包含中文字符,遍历的时候,需要将字符串转换为rune数组。例如:
s := "hello张大鹏"for _, v := range []rune(s) { fmt.Println(v, string(v))}字符缓冲流:Go也有自己的字符缓冲流,类似于Java的StringBuilder,能够更加高效地处理字符串的拼接。例如:
var buffer bytes.Bufferfor i := 0; i < 100; i++ { s := "字符串" + strconv.Itoa(i) buffer.WriteString(s)}result := buffer.String()fmt.Println(result)修改:字符串是不可变的,但是,如果要基于已有的字符串,通过适当的修改,快速地得到一个新的字符串,则可以通过将字符串转换为数组,然后操作数组来实现字符串的修改。例如:
s := "abc中国"arr := []rune(s)arr[0] = '我'arr[1] = '爱'arr[2] = '你's = string(arr)fmt.Println(s)指针类型
定义:指针类型存储的是内存地址,通过修改指针类型的值,相当于直接操作内存地址修改值。
操作符:
通过&符号可以取到一个变量的内存地址。
通过*符号可以声明指针类型或者修改指针类型的值,也可以通过*取出指针类型的值。
示例:
s := "abc中国"ps := &s*ps = "我爱你中国"fmt.Println(*ps)应用:有了指针以后,可以很轻松地实现交换两个普通变量的值。例如:
a, b := 11, 22pa := &apb := &bt := *pa*pa = *pb*pb = tfmt.Println(a, b)数组类型
定义:数组类型是同一类型元素的集合,有自己的固定长度。
赋值方式:
声明同时赋值:
arr := [5]int{11, 22, 33, 44, 55}for _, v := range arr { fmt.Println(v)}先声明后赋值:
var arr [5]intfor i := 1; i < 6; i++ { vs := strconv.Itoa(i) v, _ := strconv.Atoi(vs + vs) arr[i - 1] = v}for _, v := range arr { fmt.Println(v)}结构体类型
定义:使用struct关键字可以声明结构体类型,结构体类型有点像Java中的类,是一组属性的集合,也可以封装自己的私有方法和公开方法。
示例:
type person struct { name string age int}p := person{ name: "张大鹏", age: 33,}fmt.Println(p.name, p.age)slice类型
定义:slice又叫切片,有点像动态数组的概念,没有固定长度,可以当数组用。slice和数组的区别就在于,创建slice不需要指定长度。
示例:
arr := []string{"aa", "bb", "cc"}fmt.Println(arr)fmt.Println(arr[0])fmt.Println(arr[1:])fmt.Println(arr[:2])map类型
定义:map类型可以称作字典类型,是一种key-value类型的数据结构。
示例:
persons := make(map[string]int)persons["张三"] = 33persons["李四"] = 34for key, value := range persons { fmt.Println(key, value)}