02 go语言_数组与切片

1、数组

1-1、数量写在类型的前面。
1-2、[…] 编译所有的int。
1-3、可通过_省略变量:go 语言中定义了某个变量,后续就要用到。不用的话可以使用下标 _ 占位。
1-4、为什么使用range关键值:
(1-4-1)意义明确,美观。
(1-4-2)c++:没有类似能力。
(1-4-3)Java/Python:只能for each value,不能同时获取i,v。
1-5、数组是值类型:需要规定数组的长度。

func arrCen()  {
   	var arr1 [5]int
   	arr2 := [3]int{1,2,3}		// 冒号定义,需给出初始值
   	arr3 := [...]int{2,4,6,8}
   	var grid [4][5]int		// 定义数据为4行5列:从前往后读。[4]代表4个东西,[5]代表长度。故4个长度为5的数字。
   	fmt.Println(arr1,arr2,arr3)	// 打印结果:[0 0 0 0 0] [1 2 3] [2 4 6 8 10]
   	fmt.Println(grid)		// 打印结果:[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
   	/*
   		遍历:可以使用range关键值。
   		for i,v := range arr3{} 等同于 for i := 0; i< len(arr3); i++ {}
   	*/
   	for i,v := range arr3{
   		fmt.Println(i,v )	/* 打印结果:i下标,v 值。
   			0	2
   			1	4
   			2	6
   			3	8
   		*/
   	}
   }
   func main() {
	 arrCen()
   }

1-6、 []int 代表数组中的一个切片。
1-7、 [5]int 这才是一个数据,值类型数组。
1-8、 [10]int 和 [20]int 是不同类型。
1-9、 调用func f(arr[10]int)会拷贝数组。
1-10、在go语言中一般不直接使用数组。

func printArray(arr *[5]int)  {
   	arr[0] = 100
   	for i,v := range arr {
   		fmt.Println(i,v)
   	}
   }
   func main() {
   	 var arr13 [5]int
	arr12 := [5]int{1,3,5,7,9}
	printArray(&arr12)	/*
		0 100
		1 3
		2 5
		3 7
		4 9
	*/
	fmt.Println(arr12,arr13)	// [100 3 5 7 9] [100 0 0 0 0]

2、切片的概念

2-1、Slice 切片:详见文档:https://www.runoob.com/go/go-slice.html
2-2、切片本身没有数据,是对底层array的一个view。
2-3、arr 的值变为 []

func sliceFun()  {
   	arr := []int{0,1,2,3,4,5,6,7}
   	fmt.Println("arr[2:6]:",arr[2:6])	// arr[2:6]: [2,3,4,5]
   	fmt.Println("arr[2:]:",arr[2:])	// arr[2:]: [2,3,4,5,6,7]
   	fmt.Println("arr[:6]:",arr[:6])	// arr[:6]: [0,1,2,3,4,5]
   	fmt.Println("arr[:]:",arr[:])		// arr[:]: [0,1,2,3,4,5,6,7]
   }
   func main(){
	   sliceFun()
   }

2-4、切片可以向后扩展,不可以向前扩展。
2-5、len() 获取长度, cap() 切片最长可以达到多少。
2-6、s[i] 不可以超越 len(s),向后扩展不可以超越底层数组 cap(s)。
2-7、append() 向切片追加新元素。
2-8、向Slice添加元素:
(2-8-1)添加元素时如果超越cap,系统会重新分配更大的底层数组
(2-8-2)由于值传递的关系,必须接受append的返回值
(2-8-3)s=append(s,val)

func sliceCap()  {
   	arr := [...]int{0,1,2,3,4,5,6,7}
   	s1 := arr[2:6]
   	s2 := s1[3:5]
   	fmt.Println("s1=",s1)	// s1= [2 3 4 5]
   	fmt.Println("s2=",s2)	// s2= [5 6]
   	fmt.Printf("s1=%v,len(s1)=%d,cap(s1)=%d\n",s1,len(s1),cap(s1))	// s1=[2 3 4 5],len(s1)=4,cap(s1)=6
   	fmt.Printf("s2=%v,len(s2)=%d,cap(s2)=%d\n",s2,len(s2),cap(s2))	// s2=[[5 6],len(s2)=2,cap(s2)=3
   	s3 := append(s2,10)
   	s4 := append(s3,11)
   	s5 := append(s4,12)
   	fmt.Println("s3,s4,s5=",s3,s4,s5)	// s3,s4,s5=  [5 6 10] [5 6 10 11] [5 6 10 11 12]
   	fmt.Println("arr=",arr)	//  [0 1 2 3 4 5 6 10]
   }
   func main(){
	   sliceCap()
   }

3、切片的操作

3-1、make() 函数来创建切片。
3-2、make([]type, length, capacity) :
type:类型。
length:len 是数组的长度并且也是切片的初始长度。
capacity:可选参数。
3-3、Println :可以打印出字符串,和变量。
3-4、Printf : 只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整形。

func printSlice(s []int)  {
		fmt.Println("creating slice")
		fmt.Printf("%v,len=%d, cap=%d\n",s, len(s), cap(s))
		/*	结果打印100个:
			len=0, cap=0
			...
			len=99, cap=128
		*/
	}
	func makeSliceFun()  {
		var s []int
		for i := 0;i<100;i++ {
			printSlice(s)
			s = append(s,2*i+1)
		}
		fmt.Println(s)	// [1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199]
	
		s1 := []int{2,4,6,8}
		printSlice(s1)  // 函数打印结果:[2 4 6 8],len=4, cap=4
	
		s2 := make([]int,16)
		s3 := make([]int,10,32)
		printSlice(s2)	// 函数打印结果:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],len=16, cap=16
		printSlice(s3)	// 函数打印结果:[0 0 0 0 0 0 0 0 0 0],len=10, cap=32
	
		fmt.Println("copying slice")
		copy(s2,s1)
		printSlice(s2)	// 函数打印结果:[2 4 6 8 0 0 0 0 0 0 0 0 0 0 0 0],len=16, cap=16
	
		fmt.Println("Deleting elements from slice")
		s2 = append(s2[:3],s2[4:]...)
		printSlice(s2)	// 函数打印结果:[2 4 6 0 0 0 0 0 0 0 0 0 0 0 0],len=15, cap=16
	
		fmt.Println("Popping from front")
		front := s2[0]
		fmt.Println(front)	// 2
		s2 = s2[1:]
		printSlice(s2)	// 函数打印结果:[4 6 0 0 0 0 0 0 0 0 0 0 0 0],len=14, cap=15
	
		fmt.Println("Popping from back")
		tail := s2[len(s2)-1]
		s2 = s2[:len(s2)-1]
		fmt.Println(tail)	// [4 6 0 0 0 0 0 0 0 0 0 0 0 0],len=14, cap=15
		printSlice(s2)	// 函数打印结果:[4 6 0 0 0 0 0 0 0 0 0 0 0],len=13, cap=15
	}
   func main(){
	   makeSliceFun()
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值