go指针小结

指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func main() {
var a int= 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */

ip = &a /* 指针变量的存储地址 */

fmt.Printf("a 变量的地址是: %x\n", &a )

/* 指针变量的存储地址 */
fmt.Printf("ip 变量储存的指针地址: %x\n", ip )

/* 使用指针访问值 */
fmt.Printf("*ip 变量的值: %d\n", *ip )
}

空指针

当一个指针被定义后没有分配到任何变量时,它的值为 nil。

nil 指针也称为空指针。

nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。

1
2
3
4
5
6
7
8
9
10
11
12
    var a *int
*a = 100
fmt.Println(*a)

运行时异常:
panic: runtime error: invalid memory address or nil pointer dereference

var a = new(int)
fmt.Println(a) //<nil>
fmt.Println(*a) // 0
*a = 100
fmt.Println(*a) //100

make

###make和new区别

1、都是用来申请内存的。

2、 make只适用于 slice,map和 channle的内存创建,而且他返回的类型就是他们三个类型本身,而不是他们的指针类型,因为他们是引用类型,所以就没有必要返回他们的指针了。

3、 new很少用,一般用来给基本数据类型申请内存, stringint;返回的都是对应的类型的指针(*string, *int)

map

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var m1  map[string]int
m1 = make(map[string]int, 10)
m1["m1"] = 1
m1["m2"] = 2

fmt.Println(m1)
//若key不存在,则返回0
fmt.Println(m1["m3"]) // 0

for k := range m1{
fmt.Println(k)
}
for k, v := range m1{
fmt.Println(k, v)
}
for _, v := range m1{
fmt.Println(v)
}

map 排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

rand.Seed(time.Now().UnixNano())

var sortMap = make(map[string]int, 100)
var keys = make([]string, 0, 200)
for i := 1; i<100; i++ {
key := fmt.Sprintf("student_%02d", i)
value := rand.Intn(100)
sortMap[key] = value
keys = append(keys, key)
}

sort.Strings(keys)

for _, k := range keys {
fmt.Println(k, sortMap[k])
}

###值为map的切片

1
2
3
4
5
6
7

var s1 = make([]map[string]int, 10, 10)
s1[0] = make(map[string]int, 10)
s1[0]["北京"] = 100
fmt.Println(s1)

//[map[北京:100] map[] map[] map[] map[] map[] map[] map[] map[] map[]]

值为切片的map

1
2
3
4
5
6
7

var m1 = make(map[string][]int, 10)
m1["北京"] = make([]int, 10, 10)
m1["北京"][0] = 1
fmt.Println(m1)

//map[北京:[1 0 0 0 0 0 0 0 0 0]]

统计一个字符串中每个单词出现的次数,比如”how do you do “ 中 how 1次,do 2次,you 1次

var map1 = make(map[string]int, 10)
var str1 = "how do you do how do you do how do you do"
var s1 = make([]string, 10, 10)
s1 = strings.Split(str1, " ")
fmt.Println(s1)
for _, item := range s1 {
    value, ok := map1[item]
    fmt.Println(item)
    if ok{
        value ++
        map1[item] = value
    }else {
        map1[item] = 1
    }
}
fmt.Println(map1)