2015-08-27 4 views
3

Пример:Преобразование между типами псевдонимов в Go создает копии?

type MyString string 
var s = "very long string" 
var ms = MyString(s) 
var s2 = string(s) 

ли ms или s2 полную копию s (как это будет сделано с []byte(s))? Или они просто строковые копии структуры (которая сохраняет реальное значение в указателе)? Что делать, если мы передаем это функции? Например:

func foo(s MyString){ 
    ... 
} 
foo(ms(s)) // do we copy s here? 
+3

Это помогает запомнить, что * все * в Go является значением, а все присваивания являются копией этого значения. 'foo (ms (s))' делает копию, но не из-за преобразования. – JimB

ответ

5

Spec: Conversions:

Особые правила применяются к (непостоянные) преобразования между числовыми типами или в и из строкового типа. Эти преобразования могут изменить представление x и несут затраты времени исполнения. Все другие преобразования меняют только тип, но не вид x.

Таким образом, преобразование в и из базового типа вашего пользовательского типа не делает копию, если она.

Когда вы передаете значение функции или методу, производится и передается копия. Если вы передадите функции string, будет скопирована и передана только структура, описывающая string, так как string s являются неизменяемыми.

То же самое верно, если вы передаете срез (срезы также являются дескрипторами). Передача фрагмента сделает копию дескриптора среза, но она будет ссылаться на тот же базовый массив.

+3

Это правильно. Вот некоторые взломы 'unsafe.Pointer', чтобы доказать, что заголовки строк действительно одинаковы: http://play.golang.org/p/0khVz09-Jc. –

Смежные вопросы