Golang:make,slice和append的一个小细节
2015-09-20 15:50
351 查看
这两天写代码的时候遇到了这么一个问题,就是向slice追加元素的这么一个简单的小问题,却由于疏忽,堵了好久,现在分享一下,避免以后再犯。
代码开始是这么写的:
乍一看,似乎应该就是这样,但实际上呢?我们先来看打印一下names,
得到了这样的输出:
当时写的匆忙,看了一眼输出,只是疑惑了一下,怎么多了接个几个空格?但没太在意,就是这么几个看上去的空格把我给坑惨了,后面获得的数据死活不对,在打印一下names的长度:
到这里问题应该就很明显了,低级失误啊!
我天真的以为我创建了一个空的slice,然后用append就能将他填满,
但是现实是append无论如何都是向slice的尾部追加数据,他才不管你slice空不空呢,原来的slice只有3个长度,现在每一次append都要重新分配一次内存,几次操作以后早已是物是人非了,所以只有老老实实的从[0]开始挨个向里填数据吧!
代码开始是这么写的:
[code]urls := make(map[string]string, 3) // 这里随便个例子 urls["baidu"] = "www.baidu.com" urls["google"] = "www.google.com" urls["csdn"] = "www.csdn.net" names := make([]string, len(urls)) for key, _ := range urls { names = append(names, key) }
乍一看,似乎应该就是这样,但实际上呢?我们先来看打印一下names,
[code]fmt.Println(names)
得到了这样的输出:
当时写的匆忙,看了一眼输出,只是疑惑了一下,怎么多了接个几个空格?但没太在意,就是这么几个看上去的空格把我给坑惨了,后面获得的数据死活不对,在打印一下names的长度:
到这里问题应该就很明显了,低级失误啊!
我天真的以为我创建了一个空的slice,然后用append就能将他填满,
但是现实是append无论如何都是向slice的尾部追加数据,他才不管你slice空不空呢,原来的slice只有3个长度,现在每一次append都要重新分配一次内存,几次操作以后早已是物是人非了,所以只有老老实实的从[0]开始挨个向里填数据吧!
相关文章推荐
- iOS 锚点使用说明
- Android应用开发Camera系列(一):SurfaceView实现相机预览demo--新手上路
- Android Studio JNI NDK编程(一)
- objective-c @protocol
- Android贴吧系统学习-----悬浮布局出现的bug--android.view.WindowManager$BadTokenException:
- Android(异步任务) AsyncTask
- Android View生命周期
- iOS代码实践总结
- 控制台出现abd端口被占用,导致android项目不能正常运行
- IOS - NSURLConnection大文件下载
- iOS之旅--首尾式动画初学总结
- iOS中URL问题
- git基础
- Android LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的参数理解
- Android开发者网址导航
- iOS项目开发实战——监听对话框的按钮点击事件
- android handler机制和Timer采用
- Android事件分发完全解析(自己)
- Android内存管理机制详解
- Android开源控件----Android显示GIF图像控件------android-gif-drawable