Go基础Slice教程详解

2019-11-10 11:34:28于海丽

package main
import (
  "fmt"
)
func subtactOne(numbers []int) {
  for i := range numbers {
    numbers[i] -= 2
  }
}
func main() {
  nos := []int{8, 7, 6}
  fmt.Println("slice before function call", nos)
  subtactOne(nos)                // function modifies the slice
  fmt.Println("slice after function call", nos) // modifications are visible outside
}

上述程序的行号 17 中,调用函数将切片中的每个元素递减 2。在函数调用后打印切片时,这些更改是可见的。如果你还记得,这是不同于数组的,对于函数中一个数组的变化在函数外是不可见的。

array before function call [8 7 6] 
array after function call [6 5 4]

多维切片

类似于数组,切片可以有多个维度。

package main
import (
  "fmt"
)
func main() { 
   pls := [][]string {
      {"C", "C++"},
      {"JavaScript"},
      {"Go", "Rust"},
      }
  for _, v1 := range pls {
    for _, v2 := range v1 {
      fmt.Printf("%s ", v2)
    }
    fmt.Printf("n")
  }
}

程序的输出为,

C C++ 
JavaScript 
Go Rust
copy

切片持有对底层数组的引用。只要切片在内存中,数组就不能被垃圾回收。在内存管理方面,这是需要注意的。让我们假设我们有一个非常大的数组,我们只想处理它的一小部分。然后,我们由这个数组创建一个切片,并开始处理切片。这里需要重点注意的是,在切片引用时数组仍然存在内存中。

一种解决方法是使用copy 函数 来生成一个切片的副本。这样我们可以使用新的切片,原始数组可以被垃圾回收。

func copy(dst,src[]T)int`
package main
import (
  "fmt"
)
func main() {
  s1 :=[]int{1,2,3,4,5}
  fmt.Println("s1",s1)
  s2 := make([]int,len(s1))
  fmt.Println("s2",s2)
  copy(s2,s1)
  fmt.Println("s2",s2)
  s3 :=make([]int,len(s1)-2)
  copy(s3,s1);
  fmt.Println("s3",s3)
  s4 :=make([]int,len(s1)-1)
  copy(s4[1:3],s1[2:4]);
  fmt.Println("s4",s4)
}

打印结果:

s1 [1 2 3 4 5]
s2 [0 0 0 0 0]
s2 [1 2 3 4 5]
s3 [1 2 3]
s4 [0 3 4 0]

总结

以上所述是小编给大家介绍的Go基础Slice教程详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对易采站长站网站的支持!