文章目录

指针,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)
	}
}