写点什么

Go- 切片的定义

用户头像
HelloBug
关注
发布于: 43 分钟前
Go- 切片的定义

Go 学习笔记,学习内容《Go入门指南》


主要介绍以下内容:

  • 切片初始化

  • 切片作为函数参数

  • 使用 make 和 new 创建切片

  • make 和 new 比较

  • 多维切片


代码示例可以直接运行

package main
import ( "fmt")
func printDivider(str ...string) { fmt.Println() fmt.Println("-----------------------------------------------") if len(str) > 0 { fmt.Println(str) }}
func sum(a []int) (res int) { for _, v := range a { res += v } return}
func main() { //var a1 [5]int = {1, 2, 3, 4, 5} // 编译错误:syntax error: unexpected {, expecting expression、syntax error: non-declaration statement outside function body //var a2 [5]int = [1, 2, 3] 编译错误:assignment mismatch: 1 variables but 2 values、syntax error: unexpected comma, expecting ] /* 切片初始化 */ printDivider("切片初始化") a1 := [5]int{1, 2, 3, 4, 5} fmt.Println(a1) // 输出:[1 2 3 4 5]
var s1 []int = a1[:] // s1 是 a1 数组从0到len(a1)的引用 fmt.Println(s1) // 输出:[1 2 3 4 5]
s1[0] = 9 // 因为s1是a1的引用,所以修改s1时,a1也会发生变更 fmt.Println(s1) // 输出:[9 2 3 4 5] fmt.Println(a1) // 输出:[9 2 3 4 5]
s2 := a1[2:4] // s2是a1从下标2到下标3的切片,也是引用,即s[0] = a1[2], s[1] = a1[3] fmt.Println(s2) // 输出:[3 4] s2[0] = 88 fmt.Println(s2) // 输出:[88 4] fmt.Println(a1) // 输出:[9 2 88 4 5]
s3 := a1[:len(a1)] fmt.Println(s3) // 输出:[9 2 88 4 5]
s4 := a1[0:] fmt.Println(s4) // 输出:[9 2 88 4 5]
s5 := a1[1:] fmt.Println(s5) // 输出:[2 88 4 5]
s6 := a1[:4] fmt.Println(s6) // 输出:[9 2 88 4]
var s7 = []int{6, 6, 6} // 创建一个切片,同时创建一个数组 fmt.Println(s7) // 输出:[6 6 6] fmt.Printf("Len = %d, Cap = %d\n", len(s7), cap(s7)) // 输出:Len = 3, Cap = 3 计算切片当前的长度和容量,0 =< len(s) <= cap(s)
s8 := s7[2:] fmt.Println(s8) // 输出:[6] s8[0] = 5 fmt.Println(s8) // 输出:[6] fmt.Println(s7) // 输出:[6 6 5]
var a3 = [3]int{3, 3, 3} fmt.Println(a3) // 输出:[3 3 3] fmt.Printf("Len = %d, Cap = %d\n", len(a3), cap(a3)) // 输出:Len = 3, Cap = 3 /* 将切片作为函数参数 */ printDivider("切片作为函数参数") a4 := [5]int{2, 9, 16, 27} res := sum(a4[:]) // 将a4的切片传递给函数,即仅传递指针 fmt.Printf("Sum = %d\n", res)
/* 使用make和new创建切片 */ printDivider("使用make和new创建切片") s10 := make([]int, 10) // 创建一个切片,同时创建一个数组,切片长度为10,容量为10 fmt.Println(s10) // 输出:[0 0 0 0 0 0 0 0 0 0] fmt.Printf("Len = %d, cap = %d\n\n", len(s10), cap(s10)) // 输出:Len = 10, cap = 10
s11 := make([]int, 5, 10) // 创建一个切片,同时创建一个数组,切片长度为5,容量为10,数组长度为10,容量为10 fmt.Println(s11) // 输出:[0 0 0 0 0] fmt.Printf("Len = %d, cap = %d\n\n", len(s11), cap(s11)) // 输出:Len = 5, cap = 10
s12 := new([10]int)[0:5] // 创建一个数组指针,然后经过指针做切片 fmt.Println(s12) // 输出:[0 0 0 0 0] fmt.Printf("Len = %d, cap = %d\n\n", len(s12), cap(s12)) // 输出:Len = 5, cap = 10
a5 := new([10]int) fmt.Println(a5) // 输出:&[0 0 0 0 0 0 0 0 0 0]
/* make 和 new 比较 1、相同点:在堆上分配内存 2、不同点:行为不同,适用类型不同 new 为指定类型分配一片内存,并且返回这块内存的指针,适用于值类型,如数组、结构体等 make 返回指定类型的初始值,适用于引用类型,如切片、map、channel等 */
/* 多维切片 */ printDivider("多维切片") s20 := [][]int{{}, {}} fmt.Println(s20) // 输出:[[] []]
s21 := [][]int{{10, 20}, {100}} fmt.Println(s21) // 输出:[[10 20] [100]]}
复制代码


发布于: 43 分钟前阅读数: 2
用户头像

HelloBug

关注

还未添加个人签名 2018.09.20 加入

还未添加个人简介

评论

发布
暂无评论
Go- 切片的定义