# 概述
Golang 的数据类型按存储方式分为两大类:
1. 值类型
- int
- float
- bool
- string
- struct
- 数组
2. 引用类型
- 指针
- slice
- map
- channel
- interface
由于 channel 和 interface 涉及更加高级的编程模式,此处不做介绍。
# 值类型数据
值类型数据的特点:
(1)变量直接存储值。
(2)值类型的数据存储在栈内存空间中,栈在函数调用完内存会被释放。
# 整型数 int
| |
| var a int = 10 |
| |
| a := 10 |
| |
| var a int |
| a = 10 |
# 浮点型 float32/float64
| |
| var a float32 = 0.1 |
| |
| a := 0.1 |
| |
| var a float32 |
| a = 0.1 |
# 定长数组
| |
| var arr [3]int |
| arr := [3]int{1,2,3} |
# 字符串 string
| |
| var s string = "abc" |
| |
| s := "abc" |
| |
| var s string |
| s = "abc" |
# 结构体 struct
结构体声明 | type rectangle struct { |
| length float64 |
| width float64 |
| color string |
| } |
结构体实例化 | |
| var rec = rectangle{10.4, 25.10, "red"} |
| |
| rec := ranctangle{10.4, 25.10, "red"} |
| |
| var rec rectangle |
| rec.length = 10.4 |
| rec.width = 25.10 |
| rec.color = "red" |
| |
| rec := new(rectangle) |
| rec.length = 10.4 |
| rec.width = 25.10 |
| rec.color = "red" |
# 指针类型数据
指针类型数据的特点:
(1)引用类型变量存储的是一个地址,这个地址存储数据的值。
(2)引用数据类型的数据存储在堆内存空间中,通过 GC 回收。
# 指针
| var a int = 10 |
| |
| pa := &a |
| |
| var pa int* = &a |
| |
| var pa int* |
| pa = &a |
# slice 切片(动态数组)
空切片 | var slice1 []int |
| slice1 := make([]int ,0) |
| slice1 := []int{} |
make()分配空间 | |
| slice1 := make([]int, 5) |
| |
| slice1 := make([]int,3 ,5) |
直接赋值 | slice1 := []int{1,2,3,4,5} |
截取append()追加 | slice1 = append(slice1, 20) |
值得注意的是,append 追加后的长度是可以超过 slice 的容量 cap 的,此时 slice 将会动态扩容。在切片的容量小于 1000 个元素时,总是会成倍地增加容量。一旦元素个数超过 1000,容量的增长因子会设为 1.25,也就是会每次增加 25% 的容量。
slice后追加slice | slice3 = append(slice1, slice2) |
遍历切片 | |
| for index, value := range slice1 { |
| fmt.Printf("index: %d value: %d\n", index, value) |
| } |
| |
| for index := 0; index < len(slice1); index++ { |
| fmt.Printf("index: %d value: %d\n", index, slice[index]) |
| } |
切片拷贝copy() | count := copy(slice1, slice2) |
这行代码表示将 slice2
拷贝到 slice1
中。
若 slice2
比 slice1
长,则截断;若 slice2
比 slice1
短,则全部拷贝。
其中返回值 count
为拷贝成功的元素个数。
# map
map声明 | |
| var map1 map[string]string |
| map1 = make(map[string]string, 10) |
| map1["one"] = "java" |
| map1["two"] = "c++" |
| map1["three"] = "python" |
| |
| map2 := make(map[int]string) |
| map2[1] = "java" |
| map2[2] = "c++" |
| map2[3] = "python" |
| |
| map3 := map[string]string { |
| "one": "php", |
| "two": "c++", |
| "three": "python", |
| } |
map遍历 | for key, value := range map1 { |
| fmt.Println("key = ", key) |
| fmt.Println("value = ", value) |
| } |
map删除map修改