golang new make 区别

make用于内建类型(map、slice 和channel)的内存分配

new用于各种类型的内存分配

new(T)分配了零值填充的T类型的内存空间, 并且返回其地址,即一个*T类型的值

内建函数make(T, args)与new(T)有着不同的功能,
make只能创建slice、map和channel,
并且返回一个有初始值(非零)的T类型,而不是*T

本质来讲,导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化

The way to go

new(T) allocates zeroed storage for a new item of type T and returns its address,
a value of type *T:

   it returns a pointer to a newly allocated zero value of type T,

ready for use;

     it applies to value types like arrays and structs (see Chapter 10);
it is equivalent to &T{ }

make(T) returns an initialized value of type T;
  it applies only to the 3 built-in reference types:
slices, maps and channels (see chapters 8 and 13).

原文地址:https://www.cnblogs.com/allenhaozi/p/8684334.html

时间: 2024-10-23 08:16:22

golang new make 区别的相关文章

golang和swoole区别

开发效率 Go语言是本质上是静态语言,开发效率稍差,但性能更强,更适合底层软件的开发 Swoole使用PHP语言,动态脚本语言,开发效率最佳,更适合应用软件的开发 IO模型 go语言使用单线程eventloop处理IO事件,多线程实现协程调度,执行用户层代码 swoole使用多线程eventloop处理IO事件,多进程执行用户层php代码 Go对与IO事件的处理是单线程的,无法利用多核,吞吐量稍弱于swoole 在实际的TCP/UDP密集IO压测中,swoole表现要稍优于go Go协程(gor

go函数练习

1.编写程序,在终端输出九九乘法表. package main import ( "fmt" ) func main() { for i := 1; i <= 9; i++ { for j := 1; j <= i; j++ { fmt.Printf("%d*%d=%d%s", j, i, i*j, "\t") } fmt.Printf("%s", "\n") } } 2.一个数如果恰好等于它的

第一章.java&amp;golang的区别之:闭包

对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是想瞻仰一下如此NB的语言.年前就想在2019年做一件事情,希望能从各个细节处做一次java和golang的对比分析,不评判语言的优劣,只想用简单的语言和可以随时执行的代码来表达出两者的区别和底层涉及到的原理.今天是情人节,馒头妈妈在加班,送给自己一件贴心的礼物,写下第一篇对比文章:java&gola

【go】golang中置new()函数和make()函数的区别

Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives),其功能相似,却有本质区别. 1.new 官方文档 // The new built-in function allocates memory. The first argument is a type, // not a value, and the value returned is a pointer to a newly // allocated zero value of that

golang byte与rune区别

先看代码 package main import ( "fmt" ) func main() { var a = "hello world" var b = "中" fmt.Println([]rune(a)) fmt.Println([]rune(b)) fmt.Println([]byte(b)) } 源码也没有找到具体位置,盗用网上张图把 byte是uint8.rune为uint32,一个仅限于ascii码的值,一个支持更多的值.rune比

Golang:线程 和 协程 的区别

作者:林冠宏 / 指尖下的幽灵 博客:http://www.cnblogs.com/linguanh/ GitHub : https://github.com/af913337456/ 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities 目录 前言 协程 协程的特点 第 1 和 第 2 点 特点中的第 3 和 第

Golang两种执行流程以及区别

Go语言的执行方式有两种,一种是编译后再执行,另一种直接go run执行. 一.先编译后执行 .go文件(源代码)--->go build指令把源代码编译(如果是windows下会编译出一个.exe可执行文件,如果是linux或者mac,那么会没有后缀,仍然是一个可执行文件)--->执行输出结果 二.对源代码直接执行go run .go文件(源代码)--->底层编译运行,是隐藏的(所以这里速度稍微要比编译慢)--->执行输出结果 两种执行方式的区别 ①:如果我们先编译生成了可执行文

GoLang笔记-数组和切片,本质是就是长度不可变的可变的区别

数组 Arrays 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其长度.当作为方法的入参传入时将复制一份数组而不是引用同一指针.数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度. 初始化 数组的初始化有多种形式,查看示例代码 , 在线运行示例代码 [5] int {1,2,3,4,5} 长度为5的数组,其元素值依次为:1,2,3,4,5 [5] int {1,2} 长度为5的数组

golang中不定参数与数组切片的区别

package main import "fmt" func main() { myfunc1(88, 42, 12, 56) //传递不定数量的参数 myfunc2([]int{88, 42, 12, 56}) //传递一个数组切片 } func myfunc1(args ...int) { //接受不定数量的参数,这些参数的类型全部是int for _, arg := range args { fmt.Println(arg) } } func myfunc2(args []int