Go语言中slice的用法实例分析

本文实例讲述了Go语言中slice的用法。分享给大家供大家参考。具体如下:

slice 指向数组的值,并且同时包含了长度信息。
[]T 是一个元素类型为 T 的 slice。

代码如下:

package main
import "fmt"
func main() {
 p := []int{2, 3, 5, 7, 11, 13}
 fmt.Println("p ==", p)
 for i := 0; i < len(p); i++ {
  fmt.Printf("p[%d] == %d\n",
   i, p[i])
 }
}

slice 可以重新切片,创建一个新的 slice 值指向相同的数组。

表达式

代码如下:

s[lo:hi]

表示从 lo 到 hi-1 的 slice 元素,含有两端。 因此

代码如下:

s[lo:lo]

是空的,而

代码如下:

s[lo:lo+1]

有一个元素。

代码如下:

package main
import "fmt"
func main() {
 p := []int{2, 3, 5, 7, 11, 13}
 fmt.Println("p ==", p)
 fmt.Println("p[1:4] ==", p[1:4])
 // missing low index implies 0
 fmt.Println("p[:3] ==", p[:3])
 // missing high index implies len(s)
 fmt.Println("p[4:] ==", p[4:])
}

slice 由函数 make 创建。这会分配一个零长度的数组并且返回一个 slice 指向这个数组:

代码如下:

a := make([]int, 5)  // len(a)=5

slice 有长度和容量。slice 的容量是底层数组可以增长的最大长度。
为了指定容量,可传递第三个参数到 make:

代码如下:

b := make([]int, 0, 5)
// len(b)=0, cap(b)=5

slice 可以通过“重新切片”来扩容(增长到容量上限):

代码如下:

b = b[:cap(b)] // len(b)=5, cap(b)=5
b = b[1:]      // len(b)=4, cap(b)=4
package main
import "fmt"
func main() {
 a := make([]int, 5)
 printSlice("a", a)
 b := make([]int, 0, 5)
 printSlice("b", b)
 c := b[:2]
 printSlice("c", c)
 d := c[2:5]
 printSlice("d", d)
}
func printSlice(s string, x []int) {
 fmt.Printf("%s len=%d cap=%d %v\n",
  s, len(x), cap(x), x)
}

slice 的零值是 nil。

一个 nil 的 slice 的长度和容量是 0。

代码如下:

package main
import "fmt"
func main() {
 var z []int
 fmt.Println(z, len(z), cap(z))
 if z == nil {
  fmt.Println("nil!")
 }
}

希望本文所述对大家的Go语言程序设计有所帮助。

(0)

相关推荐

  • Go语言中的方法定义用法分析

    本文实例讲述了Go语言中的方法定义.分享给大家供大家参考.具体分析如下: 事实上,可以对包中的任意类型定义任意方法,而不仅仅是结构体. 不能对来自其他包的类型或基础类型定义方法. 复制代码 代码如下: package main import (     "fmt"     "math" ) type MyFloat float64 func (f MyFloat) Abs() float64 {     if f < 0 {         return fl

  • Go语言轻量级线程Goroutine用法实例

    本文实例讲述了Go语言轻量级线程Goroutine用法.分享给大家供大家参考.具体如下: goroutine 是由 Go 运行时环境管理的轻量级线程. go f(x, y, z) 开启一个新的 goroutine 执行 f(x, y, z) f,x,y 和 z 是当前 goroutine 中定义的,但是在新的 goroutine 中运行 f. goroutine 在相同的地址空间中运行,因此访问共享内存必须进行同步. sync 提供了这种可能,不过在 Go 中并不经常用到,因为有其他的办法.(以

  • Go语言的管道Channel用法实例

    本文实例讲述了Go语言的管道Channel用法.分享给大家供大家参考.具体分析如下: channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值. ch <- v // 将 v 送入 channel ch. v := <-ch // 从 ch 接收,并且赋值给 v. ("箭头"就是数据流的方向.) 和 map 与 slice 一样,channel 使用前必须创建: ch := make(chan int) 默认情况下,在另一端准备好之前,

  • Go语言中的switch用法实例分析

    本文实例讲述了Go语言中的switch用法.分享给大家供大家参考.具体分析如下: 这里你可能已经猜到 switch 可能的形式了. case 体会自动终止,除非用 fallthrough 语句作为结尾. 复制代码 代码如下: package main import (  "fmt"  "runtime" ) func main() {  fmt.Print("Go runs on ")  switch os := runtime.GOOS; os

  • go语言中if语句用法实例

    本文实例讲述了go语言中if语句用法.分享给大家供大家参考.具体分析如下: if 语句看起来跟 C 或者 Java 中的一样,除了没有了 ( ) 之外(甚至强制不能使用它们),而 { } 是必须的. 复制代码 代码如下: package main import (     "fmt"     "math" ) func sqrt(x float64) string {     if x < 0 {         return sqrt(-x) + "

  • Go语言中的range用法实例分析

    本文实例讲述了Go语言中的range用法.分享给大家供大家参考.具体如下: for 循环的 range 格式可以对 slice 或者 map 进行迭代循环. 复制代码 代码如下: package main import "fmt" var pow = []int{1, 2, 4, 8, 16, 32, 64, 128} func main() {     for i, v := range pow {         fmt.Printf("2**%d = %d\n"

  • go语言template用法实例

    本文实例讲述了go语言template用法.分享给大家供大家参考.具体分析如下: golang的template包很好用,做一些复杂的文本格式生成太有帮助了,生成网页也是很不错的,使用起来非常方便 复制代码 代码如下: package main import (     "fmt"     "os"     "text/template" ) type Latlng struct {     Lat float32     Lng float32

  • Go语言中Select语句用法实例

    本文实例讲述了Go语言中Select语句用法.分享给大家供大家参考.具体分析如下: select 语句使得一个 goroutine 在多个通讯操作上等待. select 会阻塞,直到条件分支中的某个可以继续执行,这时就会执行那个条件分支.当多个都准备好的时候,会随机选择一个. 复制代码 代码如下: package main import "fmt" func fibonacci(c, quit chan int) {         x, y := 1, 1         for {

  • Go语言接口用法实例

    本文实例讲述了Go语言接口用法.分享给大家供大家参考.具体分析如下: 接口类型是由一组方法定义的集合. 接口类型的值可以存放实现这些方法的任何值. 复制代码 代码如下: package main import (     "fmt"     "math" ) type Abser interface {     Abs() float64 } func main() {     var a Abser     f := MyFloat(-math.Sqrt2)   

  • Go语言中slice的用法实例分析

    本文实例讲述了Go语言中slice的用法.分享给大家供大家参考.具体如下: slice 指向数组的值,并且同时包含了长度信息. []T 是一个元素类型为 T 的 slice. 复制代码 代码如下: package main import "fmt" func main() {  p := []int{2, 3, 5, 7, 11, 13}  fmt.Println("p ==", p)  for i := 0; i < len(p); i++ {   fmt.

  • C语言中qsort函数用法实例小结

    本文实例汇总了C语言中qsort函数的常见用法,非常具有实用价值.分享给大家供大家参考.具体分析如下: C语言中的qsort函数包含在<stdlib.h>的头文件里,本文中排序都是采用的从小到大排序. 一.对int类型数组排序 int num[100]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二.对char类型数

  • javaScript中slice函数用法实例分析

    本文实例讲述了javaScript中slice函数用法.分享给大家供大家参考.具体分析如下: javaScript 中的 slice 函数,对于array对象的slice函数,返回一个数组的一段.(仍为数组) arrayObj.slice(start, [end]) 参数: arrayObj,必选项.一个 Array 对象.  start,必选项.arrayObj 中所指定的部分的开始元素是从零开始计算的下标.  end,可选项.arrayObj 中所指定的部分的结束元素是从零开始计算的下标.

  • Go语言中slice作为参数传递时遇到的一些“坑”

    前言 相信看到这个题目,可能大家都觉得是一个老生常谈的月经topic了.一直以来其实把握一个"值传递"基本上就能理解各种情况了,不过最近遇到了更深一点的"小坑",与大家分享一下. 首先还是从最简单的说起,看下面代码: func main() { a := []int{7,8,9} fmt.Printf("len: %d cap:%d data:%+v\n", len(a), cap(a), a) ap(a) fmt.Printf("le

  • Go语言中append函数用法分析

    本文实例分析了Go语言中append函数用法.分享给大家供大家参考.具体如下: Go语言中append的功能十分强大,使用它可以使很多功能的实现变得更加简洁.以下为简单对比: .将一个slice插入到另一个slice的指定位置: 不使用append: 复制代码 代码如下: func insertSliceAtIndex(slice_origin []int, slice_to_insert []int,      insertIndex int) (result []int, err error

  • C语言中getchar的用法以及实例解析

    目录 getchar解析 一.getchar的返回类型及作用机制 二.根据一段代码初步了解 三.实例(“输入密码”)进一步了解 1.代码达不到理想效果 2.输入的密码中有空格 总结 getchar解析 一.getchar的返回类型及作用机制 getchar——读取字符的函数 int getchar(void) 返回类型为int,参数为void. 有人可能会有疑惑,getchar既然是读取字符的,为什么返回类型是int呢? 1.getchar其实返回的是字符的ASCII码值(整数). 2.getc

随机推荐