Go 指针,数组,切片,Map

Go 指针,数组,切片,Map

Go 引用的方式只有一种 : 值传递

指针

  • Go语言的指针是不能进行运算的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

package main

import "fmt"

/**
Go 指针:

1.值,引用传递:

值: 值进行拷贝
引入: 地址的引用

2.Go 引用的方式只有一种 : 值传递


*/
func main() {
a,b :=1, 100
swap(&a, &b)
fmt.Printf("指针打印的 swap : a = %d b = %d\n",a,b)


d,c :=9, 88
d,c =swapK(d, c)
fmt.Printf("返回多个值 swap : d = %d c = %d\n",d,c)


/**
打印:
指针打印的 swap : a = 100 b = 1
返回多个值 swap : d = 9 c = 88
*/
}


/**
指针操作的2数互换
*/
func swap(a,b *int){
*a,*b=*b,*a
}

func swapK(a,b int) (int, int) {
return b, a
}

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

package main

import "fmt"

/**
数组:

1. 定义数组

2. 遍历数组

3. range 遍历

4. 数组是值类型: 值拷贝
在数组进行轮询的时候对某些角标值修改值的时候,因为数组是类型,是值拷贝,不会影响数组原来的值

如果需要引用的话,可以加指针操作

5. go语言一般不使用数组,是切片


*/

func main() {

//定义
var arr1 [5]int
arr2 := [3]int{1, 2, 3}
arr3 := [...]int{10, 21, 33, 49, 54}
var grid [4][5]int




PrintArr(arr1)

PrintArr(arr3)


//打印内容
fmt.Println(arr1," ",arr2," ", arr3," ", grid)



//使用 range 打印 index value
for i,v:=range arr3 {
fmt.Println(i, v)
}

fmt.Println("\n")

//如果只需要值的可以这样遍历
for _,v:=range arr3 {
fmt.Println(v)
}

/**
打印结果:

100
0
0
0
0


100
21
33
49
54


[0 0 0 0 0] [1 2 3] [10 21 33 49 54] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
0 10
1 21
2 33
3 49
4 54


10
21
33
49
54

*/



}

func PrintArr(arr [5]int) {


for i:=range arr {
//数组是值传递 即使修改了值也改变不了原来的数组内容
if i == 0 {
arr[i]= 100
}
fmt.Println(arr[i])
}

fmt.Println("\n")

}

切片: slice

  • simpleSliceTest.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package main

import "fmt"

/**
Go 语言很重要部分: Slice


1. slice 扩展

2. 向slice添加元素




*/

func main() {


arr := [...]int{2, 23, 392, 22, 9, 4}
//半开半闭区间操作:
//arr[2:5] --> arr[2] ... arr[4]
//故结果: [392 22 9]
fmt.Println(arr[2:5])


s1:=arr[2:]
fmt.Println(s1)
updateArr(s1)
fmt.Println(s1)

s2:=arr[:]
fmt.Println(s2)



/**
打印:
[392 22 9]
[392 22 9 4]
[99 22 9 4]
[2 23 99 22 9 4]
*/


//slice 扩展
var sa = []int{0, 1, 2, 3, 4, 5, 6, 7,}
fmt.Println(sa)
ss1:=sa[2:6]
ss2:=ss1[3:5]
fmt.Println("ss1 : ",ss1)
fmt.Println("ss2 : ",ss2)
/**

[0 1 2 3 4 5 6 7]
ss1 : [2 3 4 5]
ss2 : [5 6]

slice 可以向后扩展 不可以向前扩展
s[i] 不可以超越len(s),向后扩展不可以超越底层数组 cap(s)

*/


//打印相应的 caps
fmt.Printf("ss1 = %v, len(ss1) = %d , cap(ss1) = %d \n",ss1,len(ss1),cap(ss1))
fmt.Printf("ss2 = %v, len(ss2) = %d , cap(ss2) = %d \n",ss2,len(ss2),cap(ss2))


/**
ss1 = [2 3 4 5], len(ss1) = 4 , cap(ss1) = 6
ss2 = [5 6], len(ss2) = 2 , cap(ss2) = 3
*/





}



func updateArr(arr []int) {
arr[0]= 99
}
  • doSlice.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package main

import "fmt"

/**
操作 slice:
1. append 添加元素
2. copy slice
3. delete one element from slice
4. remove from head and tail
*/

func main() {

var arr []int
PrintSlice(arr)
//arr = [], len(arr) = 0 , cap(arr) = 0
fmt.Println("append element")
arr =append(arr, 10,20, 30)
PrintSlice(arr)
// arr = [10 20 30], len(arr) = 3 , cap(arr) = 4


//手动的创建 slice
arr1 :=make([]int, 16)
PrintSlice(arr1)
//arr = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], len(arr) = 16 , cap(arr) = 16


arr2 :=make([]int,16, 25)
PrintSlice(arr2)
//arr = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], len(arr) = 16 , cap(arr) = 25


fmt.Println("copy slice")
copy(arr1, arr)
PrintSlice(arr1)
//arr = [10 20 30 0 0 0 0 0 0 0 0 0 0 0 0 0], len(arr) = 16 , cap(arr) = 16

fmt.Println("delete one element from slice")
//删掉上面的30元素,index =2
arr1=append(arr1[:2],arr1[3:]...)
PrintSlice(arr1)
//arr = [10 20 0 0 0 0 0 0 0 0 0 0 0 0 0], len(arr) = 15 , cap(arr) = 16


fmt.Println("remove from head and tail")
arr1=arr1[1:]
PrintSlice(arr1)
//arr = [20 0 0 0 0 0 0 0 0 0 0 0 0 0], len(arr) = 14 , cap(arr) = 15
arr1=arr1[:len(arr1)-1]
PrintSlice(arr1)
//arr = [20 0 0 0 0 0 0 0 0 0 0 0 0], len(arr) = 13 , cap(arr) = 15





}

func PrintSlice(arr []int) {
fmt.Printf("arr = %v, len(arr) = %d , cap(arr) = %d \n",arr,len(arr),cap(arr))
}

Map

  • DoGoMap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

package main

import "fmt"

/**
Map :
1.创建方式: 这个是 HashMap 类型
m:=map[string]string{}

m:=make(map[string]int)


2.获取元素

3.判断元素是否存在 if


4.删除某个元素


5.range 遍历

6.key 类型:
除了 slice map function 内建类型都可以作为 key
struct类型不包含上述字段,也可以作为 key



*/

func main() {


//创建 map
m:=map[string]string{}

//添加元素
m["lai"]= "Lai"
m["hao"]= "Hao"
m["da"]= "Da"

PrintMap(m)
/**
lai Lai
hao Hao
da Da
*/


//删除元素
delete(m, "lai")
PrintMap(m)

/**
hao Hao
da Da
*/


//修改元素
m["hao"]= "HAhahaha.."
PrintMap(m)

/**
hao HAhahaha..
da Da
*/

//判断元素是否存在
key,ok:=m["da"]
fmt.Println(key, ok)
// Da true


if key,ok:=m["da"]; ok {
fmt.Println("存在此 key ",key)
} else {
fmt.Printf("don't have key %s exist", key)
}
//存在此 key Da


}

func PrintMap(m map[string]string) {
for k,v :=range m {
fmt.Println(k,v)
}
fmt.Println("")

}
感谢您的阅读,本文由 左之右 版权所有。如若转载,请注明出处:左之右(https://zuoyoulai.github.io/2020/01/02/Go-Struct1/
每天学习一个 Linux 指令 1 scp
Linux 用户权限权限管理