Функции JavaScript называются lamda на другом функциональном языке. Его можно использовать для создания новой api (более мощной или дополняющей функции) на основе простого ввода другого разработчика. Карри - всего лишь один из методов. Вы можете использовать его для создания упрощенного api для вызова сложного api. Если вы являетесь разработчиком, который использует упрощенную api (например, вы используете jQuery для простого манипулирования), вам не нужно использовать curry. Но если вы хотите создать упрощенную api, карри - ваш друг. Вам нужно написать фреймворк javascript (например, jQuery, mootools) или библиотеку, тогда вы сможете оценить его силу. Я написал расширенную функцию curry, в http://blog.semanticsworks.com/2011/03/enhanced-curry-method.html . Вам не нужно использовать метод curry для currying, он просто помогает делать currying, но вы всегда можете сделать это вручную, написав функцию A () {}, чтобы вернуть другую функцию B () {}. Чтобы сделать его более интересным, используйте функцию B () для возврата другой функции C ().
Пакет go-bindata выглядит так, как будто вас интересует.
https://github.com/go-bindata/go-bindata
Это позволит вам преобразовать любой статический файл в вызов функции, который может быть встроен в ваш код и будет возвращать байтовый фрагмент содержимого файла при вызове.
Если мы говорим о текстовых файлах, они легко могут быть встроены в исходный код. Просто используйте обратные кавычки, чтобы объявить литерал 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}
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:;<=>?")
также существует некоторый экзотический способ - я использую maven plugin для создания проектов GoLang и позволяет использовать препроцессор JCP для встраивания двоичных блоков и текстовых файлов в источники. В коде кода просто выглядит строка ниже (, а некоторые примеры можно найти здесь )
var imageArray = []uint8{/*$binfile("./image.png","uint8[]")$*/}
Как популярная альтернатива go-bindata
, упомянутая в другом ответе, mjibson / esc также включает в себя произвольные файлы, но особенно удобно обрабатывать каталоги дерева.