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 будет перебирать runes строки, а не поверх ее байтов в кодировке UTF8.)

Мне любопытно, почему Golang не предоставляет метод []byte(*string).

Потому что это не имеет смысла.

Указатель (на любой тип) не может быть представлен (каким-либо явно значимым образом) как []byte,

С точки зрения производительности, не будет ли []byte(string) сделать копию входного аргумента и добавить дополнительную стоимость (хотя это кажется странным, поскольку строки неизменяемы, зачем их копировать)?

Преобразование из []byte в string (и наоборот) включает в себя копию, потому что строки являются неизменяемыми, а байтовые массивы - нет.

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

Другие вопросы по тегам