Go程序:演示数组切片用法
【摘要】
在Go语言中,数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求,但是Go语言提供了数组切片(slice)这个非常酷的功能来弥补数组的不足。初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是 个指针。数组切片的数据结构可以抽象为以下3个...
在Go语言中,数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求,但是Go语言提供了数组切片(slice)这个非常酷的功能来弥补数组的不足。初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是 个指针。数组切片的数据结构可以抽象为以下3个变量:
- 一个指向原生数组的指针;
- 数组切片中的元素个数;
- 数组切片已分配的存储空间。
/*
* 功能:演示数组切片的用法
*/
package main
import (
"fmt"
)
func main() {
/* 基于数组创建数组切片 */
var arr = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var slice1 []int = arr[3:7] // 截取第4个到第7个元素
var slice2 []int = arr[:5] // 截取左边5个元素
var slice3 []int = arr[7:] // 从第8个元素开始截取
var slice4 []int = arr[:] // 全部数组元素
fmt.Println("array:", arr)
fmt.Println("slice1:", slice1)
fmt.Println("slice2:", slice2)
fmt.Println("slice3:", slice3)
fmt.Println("slice4:", slice4)
/* 直接创建数组切片 */
slice5 := make([]int, 5)
slice6 := make([]int, 5, 10)
slice7 := []int{1, 2, 3, 4, 5}
for i := 0; i < len(slice5); i++ {
slice5[i] = (i + 1) * (i + 1)
}
for i := 0; i < len(slice6); i++ {
slice6[i] = -(i + 1)
}
fmt.Println("slice5:", slice5)
fmt.Println("slice6:", slice6)
fmt.Println("slice7:", slice7)
/* 基于切片创建切片 */
slice8 := []int{45, 23, 67, 56, 43, 56, 50}
slice9 := slice8[:4] // 截取左边4个元素
slice10 := slice8[2:5] // 截取第3个到第5个元素
fmt.Println("slice8:", slice8)
fmt.Println("slice9:", slice9)
fmt.Println("slice10:", slice10)
/* 遍历数组切片 */
for i := 0; i < len(slice1); i++ {
fmt.Println("slice1[", i, "]=", slice1[i])
}
for i, v := range slice2 {
fmt.Println("slice2[", i, "]=", v)
}
/* 动态增加元素 */
slice := make([]int, 5, 10)
fmt.Println("len(slice)=", len(slice)) // 长度
fmt.Println("cap(slice)=", cap(slice)) // 容量
slice[0], slice[1], slice[2], slice[3], slice[4] = 100, 200, 300, 400, 500
slice = append(slice, 45, 23, 89) // 增加三个元素到slice
new_slice := []int{5, 7, 3} // 创建新数组切片new_slice
slice = append(slice, new_slice...) // 将新数组切片打散后添加到slice里(必须有...,表明打散)
fmt.Println("slice:", slice)
/* 内容复制 */
// 当源切片长度大于目标切片,目标切片内容全部被替换
source_slice := []int{23, 56, 56, 67, 31, 56}
target_slice := []int{46, 24, 33, 24}
fmt.Println("复制之前:")
fmt.Println("source_slice:", source_slice)
fmt.Println("target_slice:", target_slice)
copy(target_slice, source_slice) // 第一个参数是目标切片,第二个参数是源切片
fmt.Println("复制之后:")
fmt.Println("source_slice:", source_slice)
fmt.Println("target_slice:", target_slice)
// 当源切片长度小于目标切片,目标切片内容部分被替换
source_slice = []int{23, 56, 56, 67}
target_slice = []int{46, 24, 33, 24, 34, 67}
fmt.Println("复制之前:")
fmt.Println("source_slice:", source_slice)
fmt.Println("target_slice:", target_slice)
copy(target_slice, source_slice) // 第一个参数是目标切片,第二个参数是源切片
fmt.Println("复制之后:")
fmt.Println("source_slice:", source_slice)
fmt.Println("target_slice:", target_slice)
}
运行结果:
array: [1 2 3 4 5 6 7 8 9 10]
slice1: [4 5 6 7]
slice2: [1 2 3 4 5]
slice3: [8 9 10]
slice4: [1 2 3 4 5 6 7 8 9 10]
slice5: [1 4 9 16 25]
slice6: [-1 -2 -3 -4 -5]
slice7: [1 2 3 4 5]
slice8: [45 23 67 56 43 56 50]
slice9: [45 23 67 56]
slice10: [67 56 43]
slice1[ 0 ]= 4
slice1[ 1 ]= 5
slice1[ 2 ]= 6
slice1[ 3 ]= 7
slice2[ 0 ]= 1
slice2[ 1 ]= 2
slice2[ 2 ]= 3
slice2[ 3 ]= 4
slice2[ 4 ]= 5
len(slice)= 5
cap(slice)= 10
slice: [100 200 300 400 500 45 23 89 5 7 3]
复制之前:
source_slice: [23 56 56 67 31 56]
target_slice: [46 24 33 24]
复制之后:
source_slice: [23 56 56 67 31 56]
target_slice: [23 56 56 67]
复制之前:
source_slice: [23 56 56 67]
target_slice: [46 24 33 24 34 67]
复制之后:
source_slice: [23 56 56 67]
target_slice: [23 56 56 67 34 67]
文章来源: howard2005.blog.csdn.net,作者:howard2005,版权归原作者所有,如需转载,请联系作者。
原文链接:howard2005.blog.csdn.net/article/details/79333142
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)