zoukankan      html  css  js  c++  java
  • 切片和append操作

    本文转自:http://meia.fun/article/1541470004286

    学习切片时,被append这个方法困扰了半天:在main方法中把一个切片作为实参传递给另一个函数,并在这个函数内调用append方法为切片形参添加一个元素后,main方法的切片实参居然没有输出添加的元素。

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 func main() {
     8 
     9     var a []string = make([]string, 0, 10)
    15     test(a)
    16     fmt.Println(a)
    17 }
    18 
    19 func test(t []string) {
    20     t = append(t, "a")
    21     fmt.Println(t)
    22 }
    23 --------------------------------------------------------output
    24 E:/go/bin/go.exe run template.go [D:/goProjects]
    25 [a]
    26 []
    27 成功: 进程退出代码 0.

    首先要明白一点,切片是由指针(指向底层数组)、len、cap三个元素构成。在上面代码中a和t这两个切片的底层数组是相同的(但a和t是两个不同的切片,golang中只有值传递,在调用test时copy了切片a给t),按理来说两个切片的输出结果应该是一样的,可是输出的结果确不一样,原因是因为append方法不会修改原切片,只会返回更新(切片的长度、容量)后的切片并添加元素到底层数组或分配新的底层数组(在切片容量不足的时候),上面代码中其实两个切片底层共享的数组已经修改了的,但是golang在输出切片时仅输出切片长度内的内容,所以不扩展下切片  看不到另外一个切片append的元素。

    代码修改如下,即可看到append的元素:

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 func main() {
     8 
     9     var a []string = make([]string, 0, 10)
    10     test(a)
    11     fmt.Println(a)
    12     fmt.Println(a[:10])
    13 }
    14 
    15 func test(t []string) {
    16     t = append(t, "a")
    17     fmt.Println(t)
    18 }
    23 --------------------------------------------------------output
    24 E:/go/bin/go.exe run template.go [D:/goProjects]
    25 [a]
    26 []
      [a    ] 27 成功: 进程退出代码 0.

    实际开发中,在golang 里面有个简单的原则,修改什么就传什么的指针,这里修改slice自身,就传slice的指针:

     1 package main
     2 
     3 import "fmt"
     4 
     5 func main() {
     6     s1 := make([]int, 0, 5)
     7     test(&s1)
     8     fmt.Println(s1)
     9 }
    10 func test(s *[]int) {
    11     *s = append(*s, 3)
    12     fmt.Println(*s)
    13 }
  • 相关阅读:
    python
    图片放大,缩小等操作
    template-web.js 自定义过滤器
    python
    python
    Android Volley源码分析及扩展
    Android 6.0动态权限申请教程
    Jarsigner签名使用
    Python正则表达式(总)
    Python错误和异常概念(总)
  • 原文地址:https://www.cnblogs.com/hihtml5/p/9911612.html
Copyright © 2011-2022 走看看