从零开始学习GO----数据类型(1)
GO 数据类型#
- string
- int
- bool
- float
- map
- array
- slice
- chan
- interface
- structure
基础数据类型#
string:
GO 语言中字符串使用双引号来标注字符串内容,go 语言里的字符串实现是使用 UTF-8 编码
s1 := "hello"
s2 := "你好"
多行字符串
s1 := `第一行
第二行
第三行
`
字符串由一个个的字符组成,可以通过遍历获得单个字符,字符用单引号包裹起来。
var z = 'W'
Go 语言的字符有 2 种:
1.uint8 类型,简称 byte 类型,代表一个 ASCII 码的一个字符
2.rune 类型,代表一个 utf-8 类型,当有中文或者其他文字时,需要用到 rune 类型,rune 类型实际是一个 int32
// 遍历字符串
func traversalString() {
s := "hello世界"
for i := 0; i < len(s); i++ { //byte
fmt.Printf("%v(%c) ", s[i], s[i])
}
fmt.Println()
for _, r := range s { //rune
fmt.Printf("%v(%c) ", r, r)
}
fmt.Println()
}
输出
104(h) 101(e) 108(l) 108(l) 111(o) 228(ä) 184(¸) 150() 231(ç) 149() 140()
104(h) 101(e) 108(l) 108(l) 111(o) 19990(世) 30028(界)
修改字符串(有中文的或者复杂的需要转化为 rune 来修改)
字符串的修改其实是重新分配内存,并复制内容,然后修改变量的指向,原来的地址字符串是不会修改的。
func changeString() {
s1 := "big"
// 强制类型转换
byteS1 := []byte(s1)
byteS1[0] = 'p'
fmt.Println(string(byteS1))
s2 := "外国人"
runeS2 := []rune(s2)
runeS2[0] = '中'
fmt.Println(string(runeS2))
}
int 类型:
具体 int 类型可分文有符号和无符号,具体有 uint8 uint16…
int 类型分 32 位和 64 位系统,32 位系统 int 类型占 4 字节,64 位占 8 字节,uint 同理,rune 等价于 int32,byte 等价于 uint8
bool 类型:
布尔类型数据只有 true(真)和 false(假)两个值
布尔类型默认值为 false
Go 语言不允许整型转为布尔型
float 类型:
float32(单精度类型,占据 4 个字节 byte,32 个二进制位 bit)
float64(双精度类型,占据 8 个字节 byte,64 个二进制位 bit)
具体内存可以参考下面的文章:
blog.csdn.net/a451343010/article/d...
map 类型:
Go 语言中的 map 是引用类型,必须初始化才能使用,map 的变量默认初始值为 nil,需要使用 make () 函数来分配内存,make () 用于 slice,map,channel 的初始化,new (T) 函数返回指针,指向 T 的零值。
Array 数组类型:
var 数组变量名 [元素数量] 类型
数组是同一种数据类型的集合,在数组声明的时候就确定了数组的元素个数,数组的个数和类型是不能修改的,数组是值类型,赋值和传参会复制整个数组。
var arr_tmpa [3]int
var arr_tmpb [4]string
//自行推断数组的个数
var arr_tmpc = [...]int{3,7,9,11}
slice 类型
切片是一个拥有相同元素的可变长度的序列,基于数组类型的封装,它的结构包含地址,长度和容量,它是一个引用类型。
var city []T
切片拥有自己的长度和容量,可通过内置函数 len () 和 cap () 来求切片的长度和容量,切片的底层是一个数组 array, 所以可以基于数组通过切片表达式得到切片,切片表达式中的 low 和 high 表示一个索引范围(左包含,右不包含),长度 = high-low,容量等于得到切片的底层数组的容量。
func main() {
a := [5]int{1, 2, 3, 4, 5}
s := a[1:3] // s := a[low:high]
fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s))
}
//输出
s:[2 3] len(s):2 cap(s):4
func main() {
a := [5]int{1, 2, 3, 4, 5}
s := a[1:3] // s := a[low:high]
fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s))
s2 := s[3:4] // 索引的上限是cap(s)而不是len(s)
fmt.Printf("s2:%v len(s2):%v cap(s2):%v\n", s2, len(s2), cap(s2))
}
//输出
s:[2 3] len(s):2 cap(s):4
s2:[5] len(s2):1 cap(s2):1
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: