go语言学习日记 - 切片

切片


切片对于我们在处理数据的时候是很有用的工具,它能够用来灵活地存储数据,而不需要像数组一样在定义的时候就要决定分配多少空间。下面我们就来通过代码学习切片的一些特点。

package main

import "fmt"

func main() {
	//切片:slice,它的底层也是数组,可以动态改变长度
	//定义一个切片,包含多个地名
	//names := [10]string{"北京", "上海", "广州", "深圳"}
	names := []string{"北京", "上海", "广州", "深圳"}
	for i, v := range names {
		fmt.Println("i:", i, "v:", v)
	}

	//1.追加数据
	names1 := append(names, "海南")
	fmt.Printf("names:", names)
	fmt.Println("names1:", names1)

	fmt.Println("追加元素前,name的长度:", len(names), ",容量:", cap(names))
	names = append(names, "海南")
	//fmt.Println("names追加元素后赋值给自己:", names)
	fmt.Println("追加元素后,name的长度:", len(names), ",容量:", cap(names))

	names = append(names, "西藏")
	fmt.Println("追加元素后,name的长度:", len(names), ",容量:", cap(names))

	//2.对于一个切片,不仅有'长度'的概念len(),还有一个'容量'的概念cap()
	nums := []int{}
	for i := 0; i < 50; i++ {
		nums = append(nums, i)
		fmt.Println("len:", len(nums), ", cap:", cap(nums))
	}
}
package main

import "fmt"

func main() {
	names := [4]string{"北京", "上海", "广州", "深圳"}

	//想基于names创建一个新的数组
	names1 := [3]string{}
	names1[0] = names[0]
	names1[1] = names[1]
	names1[2] = names[2]

	//切片可以基于一个数组,灵活的创建新的数组
	names2 := names[0:3] //左闭右开
	fmt.Println("names2:", names2)
	fmt.Printf("names:%p", &names)
	fmt.Printf("names2:%p", names2)
	names2=append(names2,"123")
	names2=append(names2,"456")
	fmt.Printf("names2:%p", names2)

	names2[2] = "Hello"
	fmt.Println("修改names[2]之后, names2:", names2)
	fmt.Println("修改names[2]之后, names:", names)

	//1. 如果从0元素开始截取,那么冒号左边的数字可以省略
	names3 := names[:]
	fmt.Println("name3:", names3)

	//2. 如果截取到数组最后一个元素,那么冒号右边的数字可以省略
	names4 := names[:]
	fmt.Println("name4:", names4)

	//3. 如果想从左至右全部使用,那么冒号左右两边的数字都可以省略
	names5 := names[:]
	fmt.Println("name5:", names5)

	//4. 也可以基于一个字符串进行切片截取 : 取字符串的字串 helloworld
	sub1 := "helloworld"[5:7]
	fmt.Println("sub1:", sub1) //'wo'

	//5. 可以在创建空切片的时候,明确指定切片的容量,这样可以提高运行效率
	//创建一个容量是20,当前长度是0的string类型切片
	//make的时候,初始的值都是对应类型的零值 : bool ==> false, 数字==> 0, 字符串 ==> 空
	str2 := make([]string, 10, 20) //第三个参数不是必须的,如果没填写,则默认与长度相同
	fmt.Println("str2:", &str2[0])

	fmt.Println("str2: len:", len(str2), ", cap:", cap(str2))
	str2[0] = "hello"
	str2[1] = "world"

	//6.如果想让切片完全独立于原始数组,可以使用copy()函数来完成
	namesCopy := make([]string, len(names))
	//func copy(dst, src []Type) int
	//names是一个数组,copy函数介收的参数类型是切片,所以需要使用[:]将数组变成切片
	copy(namesCopy, names[:])
	namesCopy[0] = "香港"
	fmt.Println("namesCopy:", namesCopy)
	fmt.Println("naemes本身:", names)

}
posted @ 2021-05-11 22:40  压伤的芦苇  阅读(43)  评论(0编辑  收藏  举报