分享
  1. 首页
  2. 文章

【Golang 基础】Go 语言的切片

爱写作的程序猿 · · 1019 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Go 语言的切片(示例代码)

Slice 是一个通过指向数组底层,来进行变长数组的实现。

  • 定义切片的格式:var <sliceName> []<type>;
package basic
import "fmt"
func DeclaratSlice(){
 
 // 定义一个空 slice
 var slice1 []int
 fmt.Println(slice1) // []
 // 定义一个 slice 并赋初始值
 slice2 := []int{ 1, 3, 4 }
 fmt.Println(slice2) // [1 3 4]
}
  • 通过 make([]<type>, len, cap) 格式来创建 slice。其中,len 表示 slice 的长度,cap 表示 slice 的容量;cap 的值默认情况下与 len 相等,cap 可以省略;
package basic
import "fmt"
// 通过 make 声明 切片
func DeclaratSliceByMake() {
 var slice1 = make([]int, 6)
 fmt.Println(slice1) // [0 0 0 0 0 0]
}

可以通过内置函数 len()cap() 可以获取 slicelencap 的值

// 通过 make 声明 切片
func DeclaratSliceByMake() {
 var slice1 = make([]int, 6)
 fmt.Println(slice1) // [0 0 0 0 0 0]
 fmt.Println("len(slice1) = ", len(slice1)) // len(slice1) = 6
 fmt.Println("cap(slice1) = ", cap(slice1)) // cap(slice1) = 6
}

Reslice

Reslice 表示将一个 Slice 再次 Slice

  • Resliceslice 都是指向同一底层数组;
  • Reslice 的索引以 slice 的索引为准,其最大容量(cap)为 slice 的容量;
  • 索引越界不会导致底层数组的重新分配,而是引发错误。
package basic
import "fmt"
// Reslice
func Reslice() {
 array := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
 
 slice1 := array[2:5]
 slice2 := slice1[0:6]
 fmt.Println("array=", array, "len=", len(array), "cap=", cap(array)) // array= [0 1 2 3 4 5 6 7 8 9] len= 10 cap= 10
 fmt.Println("slice1=", slice1, "len=", len(slice1), "cap=", cap(slice1)) // slice1= [2 3 4] len= 3 cap= 8
 fmt.Println("slice2=", slice2, "len=", len(slice2), "cap=", cap(slice2)) // slice2= [2 3 4 5 6 7] len= 6 cap= 8
}

Slice 的操作

  • append

append() 用于在 slice 后最追加新的元素,这些元素保存到底层数组,并不会影响原 slicez,它返回变更后新的 slice 对象。

如果追加的元素超出之前的 slice 容量,则重新分配数组并拷贝原数据,并不影响底层数组。

package basic
import "fmt"
func SliceByAppend() {
 array := [...]int{0, 1, 2, 3}
 slice := array[:2]
 fmt.Printf("%p %v, cap = %d\n", slice, slice, cap(slice)) // 0xc42001c160 [0 1], cap = 4
 
 slice = append(slice, 10)
 fmt.Printf("%p %v\n", &array, array) // 0xc42001c160 [0 1 10 3] cap = 4
 fmt.Printf("%p %v, cap = %d\n", slice, slice, cap(slice)) // 0xc42001c160 [0 1 10], cap = 4
 
 slice = append(slice, 15, 20)
 fmt.Printf("%p %v cap = %d \n", &array, array, cap(array)) // 0xc42001c160 [0 1 10 3] cap = 4
 fmt.Printf("%p %v, cap = %d\n", slice, slice, cap(slice)) // 0xc420012240 [0 1 10 15 20], cap = 8
}
  • copy

copy(目标 slice, 被拷贝的 slice),用于拷贝 slice,返回值为拷贝的个数。

package basic
import "fmt"
func SliceByCopy() {
 sliceA := []int{1, 2, 3, 4, 5}
 sliceB := []int{5, 4}
 
 copyCount := copy(sliceA, sliceB)
 
 fmt.Println(copyCount) // 2
 
 fmt.Println(sliceA) // [5 4 3 4 5]
 fmt.Println(sliceB) // [5 4]
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:爱写作的程序猿

查看原文:【Golang 基础】Go 语言的切片

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1019 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏