当前位置: 首页 > news >正文

go append函数以及写入

切片

切片有两种初始化方法,一种是字面量初始化,一种是make
不建议使用new
添加成员时,容量是2的指数递增的,2,4,8,16,32。而且是在长度要超过容量时,才增加容量。

append函数

append(type,len,cap)
该函数第一个参数是类型,第二个参数是分配的空间,第三个参数是预留分配空间
a:=make([]int, 5, 10)
a[4]// 正确
a[5]//报错

这是因为cap预留的空间需要重新切片才可以使用,例如动态追加的时候重新分配空间之类。
也可以手动分配

func main(){
    a := make([]int, 10, 20)
    fmt.Println(a)
    b := a[:cap(a)]
    fmt.Println(b)
}
//[0 0 0 0 0 0 0 0 0 0]
//[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

是将一个元素追加到数组的最后,他是go的内置函数。
当我们用append追加元素到切片时,如果容量不够,go就会创建一个新的切片变量
因此append是动态增加的。不用担心 出现 index out of range的错误。

var s []string 
s= append(s ,"last")

append比较适合用字面量初始的切片。
因为make传入初始大小后,我们得到的实际上是一个含有这个size数量切片类型的空元素。此时使用append会在空元素之后再追加。

func main(){
    var s=make([]string,10);
    s=append(s,"last");
    print(s)
}
// ["0","0","0","0","0","0","0","0","0","0","last"]

如果要继续使用make来初始化的话,那么需要用到第三个参数,“cap”

func main(){
    var s=make([]string,0,10);
    s=append(s,"last");
    print(s)
}
// ["last"]

append局限性

但有其局限性,例如不能用在

type mystruct{
mystring string 
}
type mystruct2{
mystring2 string 
}
var a []mystruct
var b []mystruct2
for _, item := range b{
    b=append(a.mystring,item.mystring2)
}

而想要可以给对象数组的子属性 ,按照数组的原定顺序添加(因此也不能直接把a变成map遍历了,除非按照某种顺序重新排序),想到的一个方法是使用直接赋值表达式

for index, item := range b{
   a[index].mystring=item.mystring2
}

但是这样会报错,提示index out of range .因为a声明是默认初始化长度为0的。
改为——

var b []mystruct2
a := make([]mystruct,len(b))
for index, item := range b{
   a[index].mystring=item.mystring2
}

这样就可以解决了。
又如果,需要在循环里面筛选所需要的数据,则此时len(b)是b数组全部数据的长度。而切片给出初始大小后,得到的实际上是一个含有这个size数量切片类型的空元素。
因此没有被赋值的部分,仍然是“空”。

// a=[{"A"},{"B"},{"C"},{"D"}]
var b []mystruct2
a := make([]mystruct,len(b))
for index, item := range b{
if(index/2!=0){//奇数index
   a[index].mystring=item.mystring2
   }
}
//a=[{"A"},{},{"C"},{}]

则在对a做一些操作的时候(例如翻转)会出现一些空数据,取首位元素会取不到。

//a=[{"A"},{},{"C"},{}]
func InvertedOrder(arr []mystruct)([]mystruc){
    for from , to := 0 , len(arr) -1 ; from < to ; from , to = from + 1, to -1{
        arr[from] , arr[to] = arr[to] , arr[from]
    }
    return arr
}
a_invert := InvertedOrder(a)
//a=[{},{"C"},{},{"A"}]

一个比较low的方法是计数,然后重新切片

var count
for index, item := range b{
if(index/2!=0){//奇数index
    count++
   a[count-1].mystring=item.mystring2
   }
}
a=a[:count]

没有想到其他比较好的方法,初始化slice 的容量并不是可收缩的,用不上

参考

https://studygolang.com/artic...

相关文章:

  • mysql错误Table ‘./mysql/proc’ is marked as crashed and should be repaired
  • 于小镭:区块链将从三方面带来颠覆性认知革命
  • xtrabackup备份和还原
  • 什么时候使用HashMap?它有什么特点?
  • html中表格td的宽度如何设置
  • 关于form表单提交ajaxForm和ajaxSubmit的用法与区别
  • content属性为中文时导致html页面乱码问题
  • redis简单操作命令
  • To be or not
  • 工信部:全力做强软件和信息技术服务业
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • 不用到处找了,Coding Dojo全攻略奉上
  • 发一个 storm 小分代码 kafka
  • Windows系统基本设置
  • MySQL单机多实例配置实战
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • angular组件开发
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • JSDuck 与 AngularJS 融合技巧
  • js如何打印object对象
  • Linux链接文件
  • mysql外键的使用
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • python3 使用 asyncio 代替线程
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 双管齐下,VMware的容器新战略
  • ​比特币大跌的 2 个原因
  • #1015 : KMP算法
  • #Linux(make工具和makefile文件以及makefile语法)
  • #微信小程序:微信小程序常见的配置传旨
  • (09)Hive——CTE 公共表达式
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (pojstep1.3.1)1017(构造法模拟)
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (笔试题)分解质因式
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (蓝桥杯每日一题)love
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .bat文件调用java类的main方法
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • ;号自动换行
  • @JoinTable会自动删除关联表的数据
  • @软考考生,这份软考高分攻略你须知道
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [2010-8-30]
  • [Android]创建TabBar
  • [C++] Windows中字符串函数的种类
  • [CQOI 2011]动态逆序对
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件
  • [ESP32] 编码旋钮驱动
  • [hive] posexplode函数