【问题标题】:Slice juggling in golanggolang 中的切片杂耍
【发布时间】:2014-11-01 03:18:12
【问题描述】:

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


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

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

所以,我需要有思想、优雅、实用的方法来完成这项工作。


在此先感谢您的关注和您的时间。

UPD: 解决方案是使 SLICESTASH *[]byte 键入
并分配给他们,例如:
var slicePtr *[]byte
tmp := make([]byte, 256)
slicePtr = &tmp // Tmp is needed because we can't take adress of make() rval.

【问题讨论】:

  • 我不确定我是否理解问题所在,你想达到什么目的? s := make([]byte, 0, 5); len(s) == 0; cap(s) == 5
  • 欢迎来到 SO,如果您想获得任何帮助,请在此处包含您的代码,大多数人甚至不会点击您的外部链接。另外请务必查看stackoverflow.com/help,了解如何提出正确的问题
  • 看来 OP 正在努力解决参考问题。 setSlice 函数应该将全局 SLICE 引用翻转到 main 函数中新创建的切片。
  • @Simon 是的,但目标是什么,我的意思是他已经想出了如何使用注释行来做到这一点。
  • 这并不是new 的一种方式。想出了一个感觉“还可以”的解决方案。好像我在问问题时太困了,太匆忙了。我很抱歉。

标签: pointers go slice


【解决方案1】:

例如,

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 的 类型 S,必须是切片类型,并返回结果切片, 也是S型的。

如果 s 的容量不足以容纳附加值, append 分配一个新的,足够大的底层数组,适合 现有的切片元素和附加值。否则, append 重用底层数组。

例子:

var b []byte
b = append(b, "bar"...)    // append string contents; b == []byte{'b', 'a', 'r' }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多