文章目录
指针,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
}
1739

被折叠的 条评论
为什么被折叠?



