Go 指针,数组,切片,Map

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("")

}

附上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值