简而言之,这是一笔交易:
http://play.golang.org/p/ePiZcFfPZP
<小时/> 如果我使用注释行,一切正常,但没有 对分配大小
(cap)
的任何控制,所以切片,
在newSlice
中传递setSlice()
的引用也不起作用。
所以,我需要思想,优雅,自如的方法来完成这项工作。
<小时/> 在此先感谢,至少是为了关注和你的时间。SLICE
和STASH
*[]byte
输入
并指定给他们:
var slicePtr *[]byte
tmp := make([]byte, 256)
slicePtr = &tmp // Tmp is needed because we can't take adress of make() rval.
答案 0 :(得分:0)
例如,
package main
import "fmt"
var SLICE, STASH []byte
func init() {
SLICE = make([]byte, 0, 5)
}
func setSlice(slice []byte) {
STASH = SLICE
SLICE = slice
}
func restoreSlice() {
SLICE = STASH
}
func appendToSlice(parts ...byte) []byte {
SLICE = append(SLICE, parts...)
return SLICE
}
func main() {
appendToSlice('f', 'o', 'o')
fmt.Printf("Everything is fine: {'%s'}\n", SLICE)
newSlice := make([]byte, 0, 5)
setSlice(newSlice)
newSlice = appendToSlice('b', 'a', 'r')
fmt.Printf("Bar? No! {'%s'}\n", newSlice) // <- I need "bar" appear in newSlice.
fmt.Printf("Bar is here: {'%s'}\n", SLICE)
restoreSlice()
fmt.Printf("Back to origin. {'%s'}\n", SLICE)
}
输出:
Everything is fine: {'foo'}
Bar? No! {'bar'}
Bar is here: {'bar'}
Back to origin. {'foo'}
与Go append
内置函数一样,您的appendToSlice
函数需要返回追加的结果。
func appendToSlice(parts ...byte) []byte {
SLICE = append(SLICE, parts...)
return SLICE
}
和
newSlice = appendToSlice('b', 'a', 'r')
The Go Programming Language Specification
Appending to and copying slices
内置函数在公共切片中追加和复制辅助 操作。对于这两个函数,结果与是否无关 参数引用的内存重叠。
可变参数函数append将零或更多值x附加到s type S,必须是切片类型,并返回结果切片, 也是S型。
如果s的容量不足以容纳附加值, append分配一个适合的新的,足够大的底层数组 现有的切片元素和附加值。除此以外, append重新使用底层数组。
示例:
var b []byte b = append(b, "bar"...) // append string contents; b == []byte{'b', 'a', 'r' }