从零开始学习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 协议》,转载必须注明作者和本文链接