golang: []byte(строка) против []byte(* строка)
Мне любопытно, почему Голанг не предоставляет []byte(*string)
метод. С точки зрения производительности, не будет []byte(string)
сделать копию входного аргумента и добавить дополнительную стоимость (хотя это кажется странным, поскольку строки неизменны, зачем их копировать)?
Я новичок в Go и буду признателен за любые разъяснения.
2 ответа
[]byte("something")
это не вызов функции (или метода), это преобразование типа.
Преобразование типа "само" не копирует значение. Преобразование string
к []byte
однако, и это необходимо, потому что результирующий байт является изменяемым, и если копия не будет сделана, вы можете изменить / изменить string
значение (содержание string
) который является неизменным, он должен быть таким, как указано в разделе Spec: String types:
Строки являются неизменяемыми: после создания невозможно изменить содержимое строки.
Обратите внимание, что есть несколько случаев, когда string
<=> []byte
преобразование не делает копию, поскольку она оптимизирована компилятором. Это редкие и "жестко закодированные" случаи, когда есть доказательство неизменности string
не может / не будет изменен.
Такой пример ищет значение с карты, где тип ключа string
и вы индексируете карту []byte
, конвертировано в string
конечно ( источник):
key := []byte("some key")
var m map[string]T
// ...
v, ok := m[string(key)] // Copying key here is optimized away
Еще одна оптимизация - при измерении байтов string
это явно преобразуется в байтовый фрагмент:
s := "something"
for i, v := range []byte(s) { // Copying s is optimized away
// ...
}
(Обратите внимание, что без преобразования for range
будет перебирать rune
s строки, а не поверх ее байтов в кодировке UTF8.)
Мне любопытно, почему Golang не предоставляет метод []byte(*string).
Потому что это не имеет смысла.
Указатель (на любой тип) не может быть представлен (каким-либо явно значимым образом) как []byte
,
С точки зрения производительности, не будет ли []byte(string) сделать копию входного аргумента и добавить дополнительную стоимость (хотя это кажется странным, поскольку строки неизменяемы, зачем их копировать)?
Преобразование из []byte
в string
(и наоборот) включает в себя копию, потому что строки являются неизменяемыми, а байтовые массивы - нет.
Однако использование указателя не решило бы эту проблему.