文章目录
指针,make,new
new多用于分配值类型,返回的是指针,比如int struct
make多用于分配引用类型,比如slice, map, chan等
package main
import "fmt"
func main() {
/*
Go中的指针没有运算规则,是有&和*两个符号
new 用于给指针型变量分配空间
*/
var pointtTest bool = false
if pointtTest {
a := [...]int{1, 2, 3}
p := &a[0]
fmt.Printf("%T, %v\n", p, *p)
var b *int
fmt.Printf("%p\n", b) //0x0
var c = new(int)
fmt.Printf("%p\n", c)
}
/*
make只用于slice,map,chan的内存创建,返回值为三个类型的本身,而不是地址
*/
}
Map
底层是hash,存在动态扩容
package main
import (
"fmt"
"sort"
)
func main() {
var map_1 bool = false
if map_1 {
m1 := make(map[string]int, 5)
m1["messi"] = 10
m1["xavi"] = 6
v, ok := m1["cr7"]
if !ok {
fmt.Println("no cr7")
} else {
fmt.Println(v)
}
fmt.Println(m1["messi"], ",", m1["xavi"])
fmt.Println(m1["cr7"]) //key不存在,则拿到对应value类型的0值
}
//map遍历
var map_2 bool = false
if map_2 {
m1 := make(map[string]int, 5)
m1["messi"] = 10
m1["xavi"] = 6
for k, v := range m1 {
fmt.Println(k, ":", v)
}
//只遍历key
for k := range m1 {
fmt.Println(k)
}
//只遍历value
for _, v := range m1 {
fmt.Println(v)
}
}
// The delete built-in function deletes the element with the specified key (m[key]) from the map.
// If m is nil or there is no such element, delete is a no-op.
var map_3 bool = false
if map_3 {
m1 := make(map[string]int, 5)
m1["messi"] = 10
m1["xavi"] = 6
delete(m1, "cr7")
}
//按照指定顺序遍历map
var map_4 bool = false
if map_4 {
m1 := make(map[int]string, 20)
for i := 0; i < 20; i++ {
key := i
m1[key] = "messi"
}
fmt.Println("before sort\n", m1)
var keys = make([]int, 0, 20)
for k := range m1 {
keys = append(keys, k)
}
sort.Ints(keys)
fmt.Println("after sort")
for _, key := range keys {
fmt.Println(key, m1[key])
}
}
//元素为map类型的切片
var map_5 bool = false
if map_5 {
sliceMap := make([]map[string]string, 10)
for i := range sliceMap {
fmt.Println(i, " : ", sliceMap[i])
}
sliceMap[0] = make(map[string]string, 2)
sliceMap[0]["messi"] = "10"
sliceMap[0]["xavi"] = "6"
for _, v := range sliceMap {
for key, value := range v {
fmt.Println(key, " : ", value)
}
}
}
//值为切片类型的map
var map_6 bool = true
if map_6 {
var sliceMap = make(map[string][]string, 3)
fmt.Println(sliceMap)
fmt.Println("after init")
key := "中国"
value, ok := sliceMap[key]
if !ok {
value = make([]string, 0, 2)
}
value = append(value, "北京", "上海")
sliceMap[key] = value
fmt.Println(sliceMap)
}
}