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

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

 package main

 import (
"fmt"
) func main() { var a []string = make([]string, , )
test(a)
fmt.Println(a)
} func test(t []string) {
t = append(t, "a")
fmt.Println(t)
}
--------------------------------------------------------output
E:/go/bin/go.exe run template.go [D:/goProjects]
[a]
[]
成功: 进程退出代码 .

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

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

 package main

 import (
"fmt"
) func main() { var a []string = make([]string, , )
test(a)
fmt.Println(a)
fmt.Println(a[:])
} func test(t []string) {
t = append(t, "a")
fmt.Println(t)
}
23 --------------------------------------------------------output
24 E:/go/bin/go.exe run template.go [D:/goProjects]
25 [a]
26 []
  [a    ]
27 成功: 进程退出代码 0.

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

 package main

 import "fmt"

 func main() {
s1 := make([]int, , )
test(&s1)
fmt.Println(s1)
}
func test(s *[]int) {
*s = append(*s, )
fmt.Println(*s)
}

切片和append操作的更多相关文章

  1. go语言笔记——切片函数常见操作,增删改查和搜索、排序

    7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如  ...

  2. HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成数据的增删改查

    转:http://www.th7.cn/db/nosql/201510/135382.shtml 1. HDFS的文件append功能 早期版本的HDFS不支持任何的文件更新操作,一旦一个文件创建.写 ...

  3. pandas之DataFrame创建、索引、切片等基础操作

    知识点 Series只有行索引,而DataFrame对象既有行索引,也有列索引 行索引,表明不同行,横向索引,叫index,0轴,axis=0 列索引,表明不同列,纵向索引,叫columns,1轴,a ...

  4. GO语言学习——切片三 append()方法为切片添加元素、切片的扩容策略、使用copy()函数复制切片、从切片中删除元素

    append()方法为切片添加元素 注意:通过var声明的零值切片可以在append()函数直接使用,无需初始化. var s []int s = append(s, 1, 2, 3) append( ...

  5. HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成增删改查功能

    其实HBase/LevelDB等系统,背后都应用了Log-structured merge tree.HBase的写操作有两个步骤:1) 写入HLog(防止宕机丢失数据), 2) 写入对应的Memst ...

  6. go append 函数常见操作

    1. 将切片 b 的元素追加到切片 a 之后: a = append(a, b...) 2. 复制切片 a 的元素到新的切片 b 上: 1. b = make([]T, len(a)) 2. copy ...

  7. go递归函数如何传递数组切片slice

    数组切片slice这个东西看起来很美好,真正用起来会发现有诸多的不爽. 第一,数组.数组切片混淆不清,使用方式完全一样,有时候一些特性又完全不一样,搞不清原理很容易误使用. 第二,数组切片的appen ...

  8. go语言之切片即动态数组

    切片和数组的类型有什么不一样,我们可以打印一下,就可以知道两者的区别了,数组是容量的,所以中括号中有容量,切片的动态数组,是没有容量,这是数组和切片最大的区别 test8_4 := [20] int ...

  9. Go语言【数据结构】切片

    切片 简介 简单地说,切片就是一种简化版的动态数组.Go 数组的长度不可改变,而切片长度是不固定,切片的长度自然也就不能是类型的组成部分了.数组虽然有适用它们的地方,但是数组的类型和操作都不够灵活,因 ...

随机推荐

  1. Fiddler4抓包工具使用教程一

    本文参考自http://blog.csdn.net/ohmygirl/article/details/17846199,纯属读书笔记,加深记忆 1.抓包工具有很多,为什么要使用Fiddler呢?原因如 ...

  2. Spring Security构建Rest服务-0600-SpringSecurity基本原理

    一.引入 只要引入了spring-boot-starter-security,所有的服务都会被保护起来.启动项目,打开时所有的controller会被保护起来,随便访问一个,如http://local ...

  3. SPSS学习系列之SPSS Modeler Server是什么?

    不多说,直接上干货! SPSS Modeler 使用客户端/服务器体系结构将资源集约型操作的请求分发给功能强大的服务器软件,因而使大数据集的传输速度大大加快.除了此处所列的产品和更新,也可能还有其他可 ...

  4. OpenGL12-shader(GLSL)着色语言1(代码已上传)

    OpenGL着色语言(GLSL――OpenGL Shading Language)是用来在OpenGL中着色编程的语言, 也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic P ...

  5. Apache Thrift - 可伸缩的跨语言服务开发框架 ---转载

    src:http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/ http://thrift.apache.org/

  6. JavaScript初级面试题

    前面几题是会很基础,越下越有深度. 初级Javascript: 1.JavaScript是一门什么样的语言,它有哪些特点? 没有标准答案. 2.JavaScript的数据类型都有什么? 基本数据类型: ...

  7. BASE64转文件下载

    你可以用HTML 5 注意:返回的文件数据必须是base 64编码的,因为您不能对二进制数据进行JSON编码 在我的AJAX我得到了如下的数据结构: <!DOCTYPE html> < ...

  8. Jupyter Notebook 快速入门[转]

    Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言.在本文中,我们将介绍 Jupyter notebook 的主要特性,以 ...

  9. 【JavaScript 从零开始】变量作用域

    变量作用域 一个变量的作用域(scope)是程序源代码中定义这个变量的区域. 全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的.然而在函数内声明的变量只是函数体内有定义. 他 ...

  10. SQL语句的增删改查(详细)--转载

    转载源: http://blog.csdn.net/a88055517/article/details/6736284/ 一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [ ...