指针,make,new,map

指针,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的内存创建,返回值为三个类型的本身,而不是地址
	*/
}

指针数组

数组中的元素都是指针
pa是一个数组,数组中的元素都是int指针

package main

import "fmt"

func main() {
	a := [3]int{1, 2, 3}
	var pa [3]*int
	for i := 0; i < len(a); i++ {
		pa[i] = &a[i]
	}
	fmt.Printf("pa: %v\n", pa)
}


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)
	}
}

不要直接修改map value内某个元素的值,如果想修改map的某个键值,则必须整体赋值,如下所示

type User struct {
	age int
}

func main() {
	andes := User{age: 10}
	ma := make(map[int]User)
	ma[1] = andes
	ma[1].age = 19 //错误写法
	andes.age = 19
	ma[1] = andes
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴塞罗那的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值