Go: Что нового и делают и в чем отличия?

Go

Если у вас есть какие-либо вопросы или предложения, добро пожаловать на общение и столкновение во времени. Мой официальный аккаунт [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 (несколько дней назад я разместил статью на своем официальном аккаунте).Если инициализируемая переменная не должна выживать вне текущей области видимости, то теоретически ее не нужно инициализировать куча.

мой публичный аккаунт

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

Лучшие отношения - это достигать друг друга, твойкакэтожареная рыбаСамая большая мотивация для творчества, спасибо за поддержку.