ntent:%v\n", len(slice), slice) //len[6],content:[1 2 5 6 8 9]
fmt.Printf("len[%d],content:%v\n", len(slicecp), slicecp) //len[6],content:[10 2 5 6 8 9]
sliceN := append(slice, slicecp...)
fmt.Printf("len[%d],content:%v\n", len(sliceN), sliceN) //len[12],content:[1 2 5 6 8 9 10 2 5 6 8 9]
值类型修改值会影响本身。
slice0 := []string{"a", "b", "c", "d", "e"}
slice1 := slice0
slice1[0] = "Nick"
fmt.Println(slice0) //[Nick b c d e]
fmt.Println(slice1) //[Nick b c d e]
内存布局与扩容
切片是引用类型,指针内部只向一个数组。
代码实现,内存地址表示是同一块地址。
func main() {
var a []int = []int{1, 2, 3, 4, 5}
s := a[1:]
fmt.Printf("a=%p, s=%p \n", &(a[1]), s) //a=0xc420016188, s=0xc420016188
s = append(s, 10, 10, 10)
fmt.Printf("a=%p, s=%p \n", &a[1], s) //a=0xc420016188, s=0xc4200141c0
}
切片的长度是可变的,那自动扩容是怎样的机制呢?
是 double(双倍),看下面代码。
func main() {
var a [5]int = [...]int{1, 2, 3, 4, 5}
s := a[1:]
fmt.Println(cap(s), len(s)) //4 4
s = append(s, 10, 10, 10)
fmt.Println(cap(s), len(s)) //8 7
s = append(s, 10)
fmt.Println(cap(s), len(s)) //8 8
s = append(s, 10)
fmt.Println(cap(s), len(s)) //16 9
s = append(s, 10, 10, 10, 10)
fmt.Println(cap(s), len(s)) //16 13
s = append(s, 10, 10, 10, 10, 10, 10)
fmt.Println(cap(s), len(s)) //32 19
}
package main
import (
"fmt"
)
type slice struct {
pre *[100]int
len int
cap int
}
func make1(s slice, cap int) slice {
s.pre = new([100]int)
s.len = 0
s.cap = cap
return s
}
func modify(s slice) {
s.pre[1] = 1000
}
func testSlice() {
var s1 slice
s1 = make1(s1, 10)
s1.pre[0] = 100
modify(s1)
fmt.Println(s1.pre)
}
func main() {
testSlice()
}
模仿切片
map
map在Go语言中是作为一种内建类型存在。
key-value的数据结构,又叫字典或关联数组。
map是引用类型。
map声明是不会分配内存的,需要make初始化。
map声明初始化
声明
var a map[keytype]valuetype
var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string //嵌套
声明并初始化
var a map[string]string
a = make(map[string]string, 10)
a := make(map[string]string, 10)
a := make(map[string]string)
var a map[string]string = map[string]string{}
var a map[string]string = map[string]string{
"A": "A", //注意是逗号
}
map 使用
增删改查
m["name"] = "Nick" // "create"
delete(m, "name") // "delete"
m["name"] = "Dawn" // "update"
name := m["name"] // "read"
读取不异常
name, errbool := m["name"]
if !errbool {
m["name"] = "Nick"
}
二维map
func modify(a map[string]map[string]string) {
_, ok := a["name"]
if !ok {
a["name"] = make(map[string]string)
}
a["name"]["Nick"] = "suoning"
a["name"]["Nicky"] = "manyRou"
}
func testMap3() {
var a map[string]map[string]string
a = make(map[string]map[string]string, 10) //初始化一维
a["name"] = make(map[string]string) //初始化二维
modify(a)
fmt.Println(a)
}
slice of map
Items := make([]map[int][int], 5)
For i := 0; i < 5; i++ {
items[i] = make(map[int][int])
}
map 排序
- 先获取所有key,把key进行排序
- 按照排序好的key,进行遍历
|