本文摘自php中文网,作者藏色散人,侵删。
下面由golang教程栏目关于Golang切片的三种简单使用方式及区别,希望对需要的朋友有所帮助!概念
切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构。切片并不存储任何元素而只是对现有数组的引用。
三种方式及细节案例
①定义一个切片,然后让切片去引用一个已经创建好的数组
1 2 3 4 5 6 7 8 9 | package main
import ( "fmt" )
func main() { var arr [5]int = [...]int {1, 2, 3, 4, 5} var slice = arr[1:3]
fmt.Println( "arr=" , arr)
fmt.Println( "slice=" , slice)
fmt.Println( "slice len" , len(slice))
fmt.Println( "slice cap" , cap(slice))
}
|
②通过make来创建切片。基本语法:var 切片名 []type = make([], len, [cap]);参数说明:type是数据类型、len是大小、cap是切片容量(容量必须>=长度)
- 通过make方式创建切片可以指定切片大小和容量
- 如果没有给切片的各个元素赋值,那么就会使用默认值(int、float=>0, strint=>"", bool=>false)
- 荣国make方式创建的切片对应的数组是由make底层维护,对外不可见,也就是只能通过slice访问各个元素
1 2 3 4 5 6 7 8 9 10 11 12 | package main
import ( "fmt" )
func main() { var slice []float64 = make([]float64, 5, 10)
fmt.Println(slice)
slice[1] = 5
slice[3] = 10
fmt.Println(slice)
fmt.Println( "slice大小:" , len(slice))
fmt.Println( "slice容量:" , cap(slice))
|
③定义一个切片,直接就指定具体数组,使用原理类似于make的方式
1 2 3 4 5 6 7 8 | package main
import ( "fmt" )
func main() { var slice []string = []string{ "zhangsan" , "lisi" , "wangwu" }
fmt.Println( "slice=" , slice)
fmt.Println( "slice len" , len(slice))
fmt.Println( "slice cap" , cap(slice))
|
第一种和第二种的区别
第一种方式是直接引用数组,这个数组是事先存在的,程序员可见
第二种方式是通过make来创建切片,make也会创建一个数组,是由切片在底层维护,程序员不可见
补充:零碎案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package main
import "fmt" func main() {
s := make([]string, 3)
fmt.Println( "emp:" , s)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println( "set:" , s)
fmt.Println( "get:" , s[2])
fmt.Println( "len:" , len(s))
s = append(s, "d" )
s = append(s, "e" , "f" )
fmt.Println( "apd:" , s)
c := make([]string, len(s))
copy (c, s)
fmt.Println( "cpy:" , c)
l := s[2:5]
fmt.Println( "sl1:" , l)
l = s[:5]
fmt.Println( "sl2:" , l)
l = s[2:]
fmt.Println( "sl3:" , l)
t := []string{ "g" , "h" , "i" }
fmt.Println( "dcl:" , t)
twoD := make([][]int, 3) for i := 0; i < 3; i++ {
innerLen := i + 1
twoD[i] = make([]int, innerLen) for j := 0; j < innerLen; j++ {
twoD[i][j] = i + j
}
}
fmt.Println( "2d: " , twoD)
}
|
1 2 3 4 5 6 7 8 | len: 3apd: [a b c d e f]
cpy: [a b c d e f]
sl1: [c d e]
sl2: [a b c d e]
sl3: [c d e f]
dcl: [g h i]
2d: [[0] [1 2] [2 3 4]]
|
以上就是关于Golang切片的三种简单使用方式及区别的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
golang无法导包怎么办?
go实现安全并发map读写
编写可测试的 go 代码
golang nil 小知识
golang双向链表
手撸golang spring ioc/aop 之2
专访go语言布道师dave cheney:go语言这十年,只能用“成功”一词总结
go关于tpl文件无法读取域中数据{{$.name}}
json序列化在golang中的应用
golang如何获取客户端ip?
更多相关阅读请进入《golang》频道 >>
老貘
一个与时俱进的Go编程知识库。
转载请注明出处:木庄网络博客 » 关于Golang切片的三种简单使用方式及区别