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