ICode9

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

【golang学习笔记】切片

2021-04-18 19:34:06  阅读:156  来源: 互联网

标签:切片 slice slice3 fmt 笔记 golang 参数 Println


目录

切片的内部实现

切片可以理解为动态长度的数组。

切片的内部实现是由3部分构成:

  • 指向底层数组的指针
  • 长度:当前元素的个数,可以用len函数来获取
  • 容量:最大存储空间的个数,可以用cap函数来获取

定义切片的基本语法为:

var 切片名 []数据类型

切片只定义的话是无法使用的,还需要用make内置函数进行初始化才能进行数据的存取。切片定义和初始化更简洁的语法为:

slicename := make([]datatype,length,capacity)
// 示例,定义并初始化已问过长度为3、容量为5的切片
// 虽然容量为5,但是只会在内存中开辟长度为3的数组。
slice1 := make([]int,3,5)

示例代码:基础切片用法

package main
import "fmt"

func main(){
	var slice []string
	fmt.Println(len(slice))   // 0
	fmt.Println(cap(slice))   // 0
	fmt.Printf("%#v", slice)   // []string(nil)
	fmt.Println()

	slice = make([]string, 6)
	slice[0] = "Hello"
	slice[5] = "world"
	fmt.Printf("%#v\n", slice)   // []string{"Hello", "", "", "", "", "world"}

	slice2 := []int{1,2,3,4,5}
	slice1 := slice2
	slice1[0] = 9
	fmt.Println(slice2)   // [9 2 3 4 5]

	slice3 := make([]int,3,10)
	fmt.Println(len(slice3))   // 3
	fmt.Println(cap(slice3))   // 10
	fmt.Println(slice3)   // [0 0 0]

	slice3[0] = 1
	slice3[1] = 2
	slice3[2] = 3
	fmt.Println(slice3)   // [1 2 3]
}

切片的切割

切割切片的基本语法:

slice[i:j]   //从slice下表为i(i从0开始)的元素开始切,切片长度为 j-i
slice[i:j:k] //从slice下表为i(i从0开始)的元素开始切,切片长度为 j-i,容量为 k-i
slice[i:]    //从slice下表为i(i从0开始)的元素开始切,切割到末尾
slice[:j]    //从开头开始切,切到下标为j-1的元素,不包含j
slice[:]     //从头切到尾,等同slice复制

将切片切割为两个切片时,它们共享底层数组,因此修改其中一个,也会影响到另外一个切片

切片的扩容

可以通过append函数实现切片的扩容。append函数有两个参数:第一个参数是将被处理的切片,另一个参数是要追加的参数。

append参数会返回一个扩容后的新切片。

切片作为函数的参数

切片如果作为函数的参数,那么函数内部的切片参数和外部的切片参数实际上的底层数组是同一个对象,因此函数内部修改切片的值会影响外部的参数切片值。

// 切片作为函数的参数
package main
import "fmt"

func changes(slice []int) {
	slice[1] = 99
}

func main() {
	slice := []int{1,2,3,4,5}
	slice2 := []int{6,7,8,9,10}
	// 合并
	slice = append(slice, slice2...)
	fmt.Println(slice) // [1,2,3,4,5,6,7,8,9,10]
	changes(slice) 
	fmt.Println(slice) // 1,99,3,4,5,6,7,8,9,10
}

标签:切片,slice,slice3,fmt,笔记,golang,参数,Println
来源: https://www.cnblogs.com/XY-Heruo/p/14674275.html

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

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

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

ICode9版权所有