GO语言基础语法之切片(第十七天)

Go 语言切片(Slice),学习时候对比python 的切片
Go 数组的长度固定,切片是内置类型,长度是不固定的,可以追加(append)元素,在追加后容量(cap)增大。

定义切片

  • 声明未指定大小的数组来定义切片:
    var identifier []type //切片不需要说明长度区别于数组。
  • 使用make()函数来创建切片:
    var slice1 []type = make([]type, len)
    也可以简写为: slice1 := make([]type, len)
  • 指定容量,其中capacity为可选参数。
    make([]T, length, capacity )// len 是数组的长度并且是切片的初始长度。

切片初始化

  • 直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3
    s :=[] int {1,2,3 }
  • 初始化切片s,是数组arr的引用 , s := arr[:]
  • 创建为一个新的切片,根据下标截断 ,
    s := arr[startIndex:endIndex]
    s := arr[startIndex:] //默认 startIndex 时将表示一直到arr的最后一个元素
    s := arr[:endIndex] //默认endIndex 时将表示从arr的第一个元素开始
  • 通过切片s初始化切片s1,s1 := s[startIndex:endIndex]
  • 通过内置函数make()初始化切片s,s :=make([]int,len,cap)

len() 和 cap() 函数

切片是可索引的,由 len() 方法获取长度。提供容量的方法 cap()

切片截取

设置下限及上限来设置截取切片

append() 和 copy() 函数

在做函数调用时,slice 按引用传递(可以修改调用者源数组内容),array 按值传递(不修改调用者的原数组内容)

package main

import "fmt"
func printSlice(x []int){
	fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
func main() {
	var slice []int
	printSlice(slice)

	/* 允许追加空切片 */

	slice = append(slice, 12)
	slice = append(slice, 0)
	printSlice(slice)

	/* 向切片添加一个元素 */
	slice = append(slice, 1)
	printSlice(slice)

	/* 同时添加多个元素 */
	slice = append(slice, 2,3,4)
	printSlice(slice)

	 /*拷贝切片需要先分配好空间*/
	/* 创建切片 numbers1 是之前切片的两倍容量*/
	numbers1 := make([]int, len(slice), (cap(slice))*2)

	/* 拷贝 numbers 的内容到 numbers1 */
	copy(numbers1,slice)
	printSlice(numbers1)
}

C:\Go\bin\go.exe build -o C:\Users\l04966\AppData\Local\Temp\___go_build_qiepian_go.exe C:/Go/workspace/qiepian/qiepian.go #gosetup
C:\Users\l04966\AppData\Local\Temp\___go_build_qiepian_go.exe #gosetup
len=0 cap=0 slice=[]
len=2 cap=2 slice=[12 0]
len=3 cap=4 slice=[12 0 1]
len=6 cap=8 slice=[12 0 1 2 3 4]
len=6 cap=16 slice=[12 0 1 2 3 4]

Process finished with exit code 0

GO切片与python 切片的不同:

go有切片类型,python有列表和元组,都有切片操作。
切片方法使用是不同的。

  • go的切片,其成员是相同类型的,python的列表和元组则不限制类型。
  • 两种语言都有[a:b]这种切片操作,意义也类似,go的a、b两个index不能是负数,python可以是负数,此时就相当于从末尾往前数。
  • 两种语言都有[a🅱️c]这种切片操作,意义却是完全不同的。go的c,表示的是容量;而python的c表示的是步长。
  • python的切片产生的是新的切片对象,对新对象的成员的操作不影响旧对象,go的切片产生的是旧对象一部分的引用,对其成员的操作会影响旧对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值