Вызывает ли назначение между псевдонимами копирование в Go?
Go позволяет определять пользовательские типы с использованием псевдонимов. Возникают сомнения относительно того, приводят ли преобразования между этими типами псевдонимов к копиям или просто к структурным изменениям.
Рассмотрим следующий пример:
type MyString string var s = "very long string" var ms = MyString(s) var s2 = string(s) // Are ms or s2 a full copy of s?
Ответ:
Согласно правилам преобразования Go, непостоянные преобразования между числовыми типами или строками могут привести к стоимость выполнения из-за изменений представления. Однако все остальные преобразования, например между псевдонимами, сохраняют исходное представление без создания копий.
Поэтому и ms, и s2 не являются полными копиями s, а ссылаются на одно и то же базовое значение. .
Влияние на вызовы функций:
При передаче значений в функции обычно создаются копии. Однако это не относится к типам псевдонимов. Присвоение значения типа псевдонима параметру функции не запускает копирование:
func foo(s MyString){ ... } foo(ms) // No copy is made when passing ms to foo()
Подводя итог, хотя преобразования между типами псевдонимов не создают копии базового значения, этот принцип не распространяется на передачу значений в функции где обычно делаются копии.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3