Go 指针,数组,切片,Map
Go 引用的方式只有一种 : 值传递
指针
- Go语言的指针是不能进行运算的
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
}
数组
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
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
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
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("")
}