Лучший способ начать неизменный байт - PullRequest
0 голосов
/ 14 октября 2019

В Go вы можете инициализировать фрагмент байта следующим образом ( попробовать его на Go Playground )

package main

import (
    "fmt"
    "encoding/hex"
)

// doStuff will be called many times in actual application, so we want this to be efficient
func doStuff() {
    transparentGif := []byte("GIF89a\x01\x00\x01\x00\x80\x00\x00\xff\xff\xff" +
        "\xff\xff\xff\x21\xf9\x04\x01\x0a\x00\x01\x00\x2c\x00\x00\x00\x00" +
        "\x01\x00\x01\x00\x00\x02\x02\x4c\x01\x00\x3b\x00")
    // This will be returned by a web service in actuality, but here we just hex dump it    
    fmt.Printf("Your gif is\n%s\n", hex.Dump(transparentGif))
}

func main() {
    doStuff()
}

В этом случае данные не нужно изменять, поэтомубыло бы лучше (и, надеюсь, более эффективно) инициализировать его как константу, близкую к функции, в которой он фактически используется.

Однако, как этот вопрос проясняет, неттакая вещь, как константный срез в Go.

Есть ли более эффективный способ сделать это, сохраняя при этом небольшой объем? В идеале, когда конкатенация и выделение памяти выполняются только один раз.

Насколько я знаю, мне нужно создать фрагмент вне области действия функции, а затем передать его в качестве параметра, то есть расширить область.

1 Ответ

1 голос
/ 14 октября 2019

Объявите transparentGif как переменную уровня пакета и используйте эту переменную в функции.

var transparentGif = []byte("GIF89a\x01\x00\x01\x00\x80\x00\x00\xff\xff\xff" +
        "\xff\xff\xff\x21\xf9\x04\x01\x0a\x00\x01\x00\x2c\x00\x00\x00\x00" +
        "\x01\x00\x01\x00\x00\x02\x02\x4c\x01\x00\x3b\x00")

func doStuff() {
    fmt.Printf("Your gif is\n%s\n", hex.Dump(transparentGif))
}

Это добавляет объявление в область действия пакета, но в остальном аккуратно и аккуратно. Вызывающие doStuff вынуждены знать об этой детали, если добавлен аргумент, как предложено в вопросе.

...