Если мы говорим о текстовых файлах, они легко могут быть встроены в исходный код. Просто используйте обратные кавычки, чтобы объявить литерал string
следующим образом:
const html = `
Example embedded HTML content.
`
// Sending it:
w.Write([]byte(html)) // w is an io.Writer
Совет по оптимизации:
. В большинстве случаев вам нужно будет только записать ресурс в io.Writer
, вы также можете сохранить результат преобразования []byte
:
var html = []byte(`
Example...
`)
// Sending it:
w.Write(html) // w is an io.Writer
Единственное, о чем вы должны быть осторожны, это то, что необработанные строковые литералы не могут содержать символ обратной цитаты (`). Необработанные строковые литералы не могут содержать последовательности (в отличие от интерпретируемых строковых литералов), поэтому, если текст, который вы хотите внедрить, содержит обратные кавычки, вам нужно разбить исходный строковый литерал и объединить кавычки в качестве интерпретированных строковых литералов, как в этом примере:
var html = `This is a back quote followed by a dot: ` + "`" + `.
`
Производительность не изменяется, так как эти конкатенации будут выполняться компилятором.
Для двоичных файлов (например, изображений) наиболее компактных (в отношении результирующего нативного двоичного файла) и наиболее эффективных было бы иметь содержимое файла как []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 = ""
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:;<=>?")
Алгоритм основан на поиске маршрута между двумя точками, а другой проверяет, могут ли все точки быть связаны (имея маршрут между ними):
Это проблема графа связанного компонента .
Вы можете выполнить поиск в глубину на каждом узле и получить подключенный компонент. Если у вас есть более двух компонентов в результате, тогда да, весь объект не связан со всеми другими объектами.
class MyObject {
var id: Int = 0
var connectedIds: [Int] = []
}
func isAlreadyVisited(n: MyObject, cc: inout [[MyObject]]) -> Bool {
for c in cc {
c.forEach {
return ([110].id == n.id)
}
}
return false
}
func connectedComponent(g: [MyObject]) -> [[MyObject]] {
var cc = [[MyObject]]()
for n in g {
if !isAlreadyVisited(n: n, cc: &cc) {
var c = DFS(n, g) // Use placeHolder for DFS, you can write your own
cc.append(contentsOf: c)
}
}
return cc
}
var cc = connectedComponent(g: [MyObject(), MyObject()])