Как создать приложение go с активами [duplicate]

Вы не можете сделать это, как вы себе представляете, потому что вы не можете использовать await, если он не находится непосредственно внутри функции async.

Разумная вещь здесь сделать функцию, переданную в map асинхронной. Это означает, что map вернет массив обещаний. Затем мы можем использовать Promise.all, чтобы получить результат, когда все обещания вернутся. Поскольку сам Promise.all возвращает обещание, внешняя функция не должна быть async.

const someFunction = (myArray) => {
    const promises = myArray.map(async (myValue) => {
        return {
            id: "my_id",
            myValue: await service.getByValue(myValue)
        }
    });
    return Promise.all(promises);
}
79
задан Jimmy Sawczuk 16 December 2012 в 21:00
поделиться

4 ответа

Пакет go-bindata выглядит так, как будто вас интересует.

https://github.com/go-bindata/go-bindata

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

66
ответ дан gimpf 21 August 2018 в 17:05
поделиться
  • 1
    Продвижение в моем случае кажется странным, но я все равно сделаю это: p Для записи, однако, это не пакет, а инструмент командной строки. – jimt 17 December 2012 в 00:36
  • 2
    Только для записи, это путь, который я взял с моим проектом. В какой-то момент @jimt представила некоторые новые функции, чтобы сделать вещи более удобными для пользователя, но больше не предоставляла необходимую мне гранулярность, поэтому я написал свой собственный инструмент, который имеет меньше возможностей, но предназначен для моей утилиты (я использую этот инструмент как своего рода преамбула к процессу сборки): github.com/jimmysawczuk/go-binary – Jimmy Sawczuk 21 January 2015 в 18:03

Вставка текстовых файлов

Если мы говорим о текстовых файлах, они легко могут быть встроены в исходный код. Просто используйте обратные кавычки, чтобы объявить литерал string следующим образом:

const html = `
<html>
<body>Example embedded HTML content.</body>
</html>
`

// Sending it:
w.Write([]byte(html))  // w is an io.Writer

Совет по оптимизации:

. В большинстве случаев вам нужно будет только записать ресурс в io.Writer , вы также можете сохранить результат преобразования []byte:

var html = []byte(`
<html><body>Example...</body></html>
`)

// Sending it:
w.Write(html)  // w is an io.Writer

Единственное, о чем вы должны быть осторожны, это то, что необработанные строковые литералы не могут содержать символ обратной цитаты (`). Необработанные строковые литералы не могут содержать последовательности (в отличие от интерпретируемых строковых литералов), поэтому, если текст, который вы хотите внедрить, содержит обратные кавычки, вам нужно разбить исходный строковый литерал и объединить кавычки в качестве интерпретированных строковых литералов, как в этом примере:

var html = `<p>This is a back quote followed by a dot: ` + "`" + `.</p>`

Производительность не изменяется, так как эти конкатенации будут выполняться компилятором.

Вставка двоичных файлов

Фиксация как байтового фрагмента

Для двоичных файлов (например, изображений) наиболее компактных (в отношении результирующего нативного двоичного файла) и наиболее эффективных было бы иметь содержимое файла как []byte в исходном коде. Это может быть создано сторонними toos / libraries, такими как go-bindata .

Если вы не хотите использовать стороннюю библиотеку для этого, вот простой фрагмент кода, который читает двоичный файл и выводит исходный код Go, который объявляет переменную типа []byte, которая будет инициализирована с точным содержимым файла:

imgdata, err := ioutil.ReadFile("someimage.png")
if err != nil {
    panic(err)
}

fmt.Print("var imgdata = []byte{")
for i, v := range imgdata {
    if i > 0 {
        fmt.Print(", ")
    }
    fmt.Print(v)
}
fmt.Println("}")

Пример вывода, если файл будет содержать байты из 0 до 16 (попробуйте на Go Playground ):

var imgdata = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}

Хранение в качестве base64 string

Если файл не «слишком большой» «(большинство изображений / значков соответствуют критериям), есть и другие жизнеспособные варианты. Вы можете преобразовать содержимое файла в Base64 string и сохранить его в исходном коде. При запуске приложения (func init()) или при необходимости вы можете декодировать его до исходного []byte контента. Go имеет хорошую поддержку кодировки Base64 в пакете encoding/base64 .

Преобразование двоичного файла в base64 string выполняется так же, как:

data, err := ioutil.ReadFile("someimage.png")
if err != nil {
    panic(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(data))

Сохраните строку result64 в исходном коде, например как const.

Декодирование это всего лишь один вызов функции:

const imgBase64 = "<insert base64 string here>"

data, err := base64.StdEncoding.DecodeString(imgBase64) // data is of type []byte

Хранение как указано string

Более эффективно, чем сохранение в качестве base64 , но может быть более длинным в исходном коде, это сохранение строкового литерала , цитируемого двоичных данных. Мы можем получить цитированную форму любой строки, используя функцию strconv.Quote() :

data, err := ioutil.ReadFile("someimage.png")
if err != nil {
    panic(err)
}
fmt.Println(strconv.Quote(string(data))

Для двоичных данных, содержащих значения от 0 до 64, это то, как будет выглядеть вывод (попробуйте на Go Playground ):

"\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"

(Обратите внимание, что strconv.Quote() добавляет и добавляет к нему кавычку.)

Вы можете напрямую использовать эту цитированную строку в своем исходном коде, например:

const imgdata = "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"

Он готов к использованию, нет необходимости его декодировать; unquoting выполняется компилятором Go во время компиляции.

Вы также можете сохранить его в виде байтового фрагмента, если вам это нужно:

var imgdata = []byte("\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?")
27
ответ дан icza 21 August 2018 в 17:05
поделиться
  • 1
    есть ли способ связать файл sh с исполняемым файлом go? – Kasun Siyambalapitiya 9 November 2017 в 12:34
  • 2
    Я думаю, что данные должны быть imgdata в первом фрагменте кода под «хранением в виде байтового сегмента», раздел. – logical x 2 21 November 2017 в 18:55
  • 3
    @deusexmachina Ты прав, исправил это. Код на игровой площадке уже был прав. – icza 21 November 2017 в 19:05
  • 4
    Фактически, это первый раз, когда я видел этот способ («хранение как байтовый срез») встраивания двоичного файла в исходный код. Довольно аккуратно:) – logical x 2 21 November 2017 в 22:00

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

var imageArray = []uint8{/*$binfile("./image.png","uint8[]")$*/}
2
ответ дан Igor Maznitsa 21 August 2018 в 17:05
поделиться
  • 1
    @ можно связать каталог, имеющий sh или исполняемый файл, как указано выше – Kasun Siyambalapitiya 9 November 2017 в 12:36
  • 2
    @ KasunSiyambalapitiya Привязать каталог? Привязать файл sh? Не уверен, что вы имеете в виду. Если вы хотите, чтобы все в каталоге было встроено, это то, что я сделал с go-bindata. Например, если я помещаю //go:generate $GOPATH/bin/go-bindata -prefix=data/ -pkg=$GOPACKAGE data/ в файл (не сгенерированный) go, go generate ./... будет запускать go-bindata в каталоге пакета, вставляя все в поддиремент данных, но с удаленным префиксом «data /». – Mark 26 November 2017 в 06:16
0
ответ дан robx 1 November 2018 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: