切片和append操作
本文转自: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操作的更多相关文章
- go语言笔记——切片函数常见操作,增删改查和搜索、排序
7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如 ...
- HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成数据的增删改查
转:http://www.th7.cn/db/nosql/201510/135382.shtml 1. HDFS的文件append功能 早期版本的HDFS不支持任何的文件更新操作,一旦一个文件创建.写 ...
- pandas之DataFrame创建、索引、切片等基础操作
知识点 Series只有行索引,而DataFrame对象既有行索引,也有列索引 行索引,表明不同行,横向索引,叫index,0轴,axis=0 列索引,表明不同列,纵向索引,叫columns,1轴,a ...
- GO语言学习——切片三 append()方法为切片添加元素、切片的扩容策略、使用copy()函数复制切片、从切片中删除元素
append()方法为切片添加元素 注意:通过var声明的零值切片可以在append()函数直接使用,无需初始化. var s []int s = append(s, 1, 2, 3) append( ...
- HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成增删改查功能
其实HBase/LevelDB等系统,背后都应用了Log-structured merge tree.HBase的写操作有两个步骤:1) 写入HLog(防止宕机丢失数据), 2) 写入对应的Memst ...
- go append 函数常见操作
1. 将切片 b 的元素追加到切片 a 之后: a = append(a, b...) 2. 复制切片 a 的元素到新的切片 b 上: 1. b = make([]T, len(a)) 2. copy ...
- go递归函数如何传递数组切片slice
数组切片slice这个东西看起来很美好,真正用起来会发现有诸多的不爽. 第一,数组.数组切片混淆不清,使用方式完全一样,有时候一些特性又完全不一样,搞不清原理很容易误使用. 第二,数组切片的appen ...
- go语言之切片即动态数组
切片和数组的类型有什么不一样,我们可以打印一下,就可以知道两者的区别了,数组是容量的,所以中括号中有容量,切片的动态数组,是没有容量,这是数组和切片最大的区别 test8_4 := [20] int ...
- Go语言【数据结构】切片
切片 简介 简单地说,切片就是一种简化版的动态数组.Go 数组的长度不可改变,而切片长度是不固定,切片的长度自然也就不能是类型的组成部分了.数组虽然有适用它们的地方,但是数组的类型和操作都不够灵活,因 ...
随机推荐
- EF基础知识小记七(拆分实体到多个表以及拆分表到多个实体)
一.拆分实体到多个表 1.在日常开发中,会经常碰到一些老系统,当客户提出一些新的需求,这些需求需要在原来的表的基础上加一些字段,大多数人会选择通过给原表添加字段的方式来完成这些需求,方法,虽然可行,但 ...
- 小程序api-01-abcdefg
目录-abcdefg wx.scanCode(OBJECT) 调起客户端扫码界面,扫码成功后返回对应的结果 wx.scanCode({ success: (res) => { console ...
- 【转】Spark源码分析之-Storage模块
原文地址:http://blog.csdn.net/aiuyjerry/article/details/8595991 Storage模块主要负责数据存取,包括MapReduce Shuffle中间结 ...
- Java虚拟机(二):JVM内存模型
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...
- WPF中List的Add()与Insert()方法的区别
先来看看定义: // Summary: // Adds an object to the end of the System.Collections.Generic.List<T>. // ...
- leetcode 98,判断二叉树为BST
方法一,记录子树的上界和下界,root的左子树一定小于root的值,root的右子树一定大于root的值,然后递归左子树和右子树 public class Solution { public bool ...
- word黑底白字
我们在使用word文档编辑文件时,有时候希望某段文字采用黑底白字,以区分其他段落的白底黑字从而达到强调的效果. 方法是: 1. 选中待处理的段落. 2. 点击“设计”选项卡. 3. 找到“设计”选下卡 ...
- 【起】ACM类下为过往所做过的部分算法题目
[起]ACM类下为过往所做过的部分算法题目 几百道题,日后细细品味.
- CentOS探索之路3---安装python3
安装Python3 总述 一般来说Linux类型的操作系统都会自带安装python,但是系统默认安装的python都是2.x的版本.而现在一般使用的是python3.x版本,相比于python2. ...
- Springboot --- Spring Security (一)
文章部分图片来自参考资料 问题 : Spring Security 内部实现的原理是什么 概述 Spring Security 是个安全框架,可以提供认证,防止网络功能等功能,可以结合 sprin ...