ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

GO语言学习——切片三 append()方法为切片添加元素、切片的扩容策略、使用copy()函数复制切片、从切片中删除元素

2022-04-30 20:33:24  阅读:188  来源: 互联网

标签:a1 s1 元素 切片 Println GO fmt append


append()方法为切片添加元素

注意:通过var声明的零值切片可以在append()函数直接使用,无需初始化。

var s []int
s = append(s, 1, 2, 3)
  1. append()函数将元素追加到切片的最后并返回该切片。
  2. 切片numSlice的容量按照1,2,4,8,16这样的规则自动进行扩容,每次扩容后都是扩容前的2倍。

切片的扩容策略

查看$GOROOT/src/runtime/slice.go源码

package main

import "fmt"

// append() 为切片追加元素

func main(){
	s1 := []string{"北京", "上海", "深圳"}
	fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
	// s1[3] = "广州" // 错误的写法 会导致编译错误:索引越界
	// fmt.Println(s1)  // index out of range [3] with length 3

	// 调用append函数必须用原来的切片变量接收返回值
	// append追加元素 原来的底层数组放不下的时候 Go语言就会把底层数组换一个
	// 必须用变量接收append的返回值
	fmt.Println(s1)
	s1 = append(s1, "广州") 
	fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
	s1 = append(s1, "杭州", "成都")
	fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
	ss := []string{"武汉", "西安", "苏州"}
	s1 = append(s1, ss...) // ...表示拆开
	fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
}

使用copy()函数复制切片

copy()函数的格式:

copy(destSlice, srcSlice []T)

其中:

  • srcSlice: 数据来源切片
  • destSlice: 目标切片

从切片中删除元素

package main

import "fmt"

// 关于append删除切片中的某个元素

func main(){
	a1 := [...]int{1,3,5,7,9,11,13,15,17}
	s1 := a1[:]
	
	// 删除索引为1的那个3
	s1 = append(s1[0:1], s1[2:]...)
	fmt.Println(s1) // [1 5 7 9 11 13 15 17]
	fmt.Println(a1) // [1 5 7 9 11 13 15 17 17]
}

切片不存值 底层数组存值

package main

import "fmt"

// copy

func main() {
	a1 := []int{1,3,5}
	a2 := a1  // 赋值
	// var a3 []int // nil
	var a3 = make([]int, 3, 3)
	copy(a3, a1) // copy
	fmt.Println(a1, a2, a3)
	a1[0] = 100
	fmt.Println(a1, a2, a3)

	// 将a1中的索引为1的3这个元素删除
	a1 = append(a1[:1], a1[2:]...)
	fmt.Println(a1)
	fmt.Println(cap(a1))

	x1 := [...]int{1, 3, 5} // 数组
	s1 := x1[:]
	fmt.Println(s1, len(s1), cap(s1))
	// 1. 切片不保存具体的值
	// 2. 切片对应一个底层数组
	// 3. 底层数组都是占用一块连续的内存
	fmt.Printf("%p\n", &s1[0])
	s1 = append(s1[:1], s1[2:]...) // 修改了底层数组!
	fmt.Printf("%p\n", &s1[0])
	fmt.Println(s1, len(s1), cap(s1))
	// ?
	// s1[0] = 100 // 修改底层数组
	fmt.Println(x1) // [1 5 5]
}

练习题

package main

import (
	"fmt"
	"sort"
)

// 切片的练习题

func main() {
	var a = make([]int, 5, 10) // 创建切片 长度为5 容量为10
	fmt.Println(a) // [0 0 0 0 0]
	for i := 0; i < 10; i++ {
		a = append(a, i)
	}
	fmt.Println(a) // [0 0 0 0 0 0 1 2 3 4 5 6 7 8 9]
	fmt.Println(cap(a))

	// sort排序
	var a1 = [...]int{3, 7, 8, 9, 1}
	sort.Ints(a1[:]) // 对切片进行排序
	fmt.Println(a1)
}

标签:a1,s1,元素,切片,Println,GO,fmt,append
来源: https://www.cnblogs.com/QiaoPengjun/p/16211171.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有