切片在golang玩杂耍

时间:2014-09-07 22:04:38

标签: pointers go slice

简而言之,这是一笔交易:
http://play.golang.org/p/ePiZcFfPZP

<小时/> 如果我使用注释行,一切正常,但没有 对分配大小(cap)的任何控制,所以切片,
如果我弄错了,每次超过限制时都要重新分配 而且,他们从零容量开始。

newSlice中传递setSlice()的引用也不起作用。

所以,我需要思想,优雅,自如的方法来完成这项工作。

<小时/> 在此先感谢,至少是为了关注和你的时间。

UPD: 解决方案是使SLICESTASH *[]byte输入 并指定给他们:

var slicePtr *[]byte
tmp := make([]byte, 256)
slicePtr = &tmp // Tmp is needed because we can't take adress of make() rval.

1 个答案:

答案 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' }