Go- 切片的定义
发布于: 43 分钟前
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
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/c85e46973b1f11df0c1e580d0】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
HelloBug
关注
还未添加个人签名 2018.09.20 加入
还未添加个人简介
评论