Если у вас есть какие-либо вопросы или предложения, добро пожаловать на общение и столкновение во времени. Мой официальный аккаунт [Brain fried fish], адрес GitHub:GitHub.com/Vicious Genetics.
Всем привет, я жареная рыба.
В языке Go есть две похожие встроенные функции, а именноnewиmakeметод, его основной целью является выделение соответствующего типа пространства памяти.
выглядитnewиmakeОба выделяют память, так какая между ними разница? Эта деталь также стала одним из вопросов на собеседованиях многих разработчиков языка Go, и на нее стоит обратить внимание.
В сегодняшней статье мы ответим на этот вопрос в будущем.
Основные характеристики
make
В языке Go встроенные функцииmakeТолько поддержкаslice,map,channelСоздание памяти трех типов данных,Его возвращаемое значение — это сам созданный тип, а не ссылка на новый указатель..
Сигнатура функции следующая:
func make(t Type, size ...IntegerType) Type
Специфические примеры использования:
func main() {
v1 := make([]int, 1, 5)
v2 := make(map[int]bool, 5)
v3 := make(chan int, 1)
fmt.Println(v1, v2, v3)
}
В коде мы вызываем три типа по отдельностиmakeФункция инициализирована. Вы обнаружите, что некоторые входные параметры имеют несколько спецификаций длины, а некоторые нет.
Главное отличие этого блока в указании длины (len) и вместимости (cap), некоторые типы не имеют вместимости, поэтому, естественно, их нельзя указать.
Выходной результат:
[0] map[] 0xc000044070
Следует отметить одну деталь: вызовmakeКогда функция деинициализирует тип среза, он будет иметь нулевое значение, и должно быть ясно, требуется ли это.
Я видел много мелких партнеров, наступивших на эту яму.
new
В языке Go встроенные функцииnewТипы могут быть созданы и инициализированы в памяти.Его возвращаемое значение является указателем на созданный тип.,иmakeФункция отличается от основных деталей.
Сигнатура функции следующая:
func new(Type) *Type
Специфические примеры использования:
type T struct {
Name string
}
func main() {
v := new(T)
v.Name = "煎鱼"
}
Судя по эффекту приведенного выше примера, кажется ли это похожим? По сути, это то же самое, что и следующий способ:
func main() {
v := T{}
v.Name = "煎鱼"
}
Выходные результаты:
&{Name:煎鱼}
фактическиnewФункции редко встречаются в повседневном инженерном коде, потому что их можно заменить.
Обычно используют быстрыйT{}для инициализации, потому что обычные структуры имеют буквальные свойства структур:
func NewT() *T {
return &T{Name: "煎鱼"}
}
Этот метод инициализации удобнее.
в чем разница
Некоторые друзья могут быть немного сбиты с толку, т.newФункции также могут быть инициализированыmakeтрех видов:
v1 := new(chan bool)
v2 := new(map[string]struct{})
ТотmakeВ чем разница в функциях?
по существуmakeКогда функция инициализируется, она будет инициализированаslice,chan,mapвнутренняя структура данных типа,newФункции — нет.
Например: вmapРазумная длина (LEN) и емкость (CAP) по типу могут повысить эффективность и снизить накладные расходы.
Дополнительные отличия:
-
makeфункция:- Возможность создания пространства памяти, требуемого типом, возвращая сам ссылочный тип.
- Имеет ограниченную область применения и поддерживает только
channel,map,sliceТри типа. - имеет уникальные преимущества,
makeФункция присваивает значения трем типам внутренних структур данных (длина, емкость и т. д.).
-
newфункция:- Возможность создавать и выделять требуемое типом пространство памяти, возвращая ссылку на указатель (указатель на память).
- Может быть переопределен и может быть быстро инициализирован литералом.
Суммировать
В этой статье мы представили язык GomakeиnewАнализируется использование функций, анализируются его отличительные черты.
Могут быть некоторые сомнения о друзьях, тогдаnewиmakeИнициализируется ли память функцией, выделенной в куче или стеке?
Это включает в себя «анализ побега» на языке Go (несколько дней назад я разместил статью на своем официальном аккаунте).Если инициализируемая переменная не должна выживать вне текущей области видимости, то теоретически ее не нужно инициализировать куча.
мой публичный аккаунт
Поделитесь языком, архитектуру микросервиса и странный дизайн системы, приветствуют всех, чтобы уделить внимание моего официального аккаунта и общаться со мной.
Лучшие отношения - это достигать друг друга, твойкакэтожареная рыбаСамая большая мотивация для творчества, спасибо за поддержку.