首页 > 其他分享 >Golang new 和 make 函数

Golang new 和 make 函数

时间:2023-05-07 22:32:24浏览次数:53  
标签:map 初始化 int make Golang new fmt

在 Golang 中 new() 函数是另外一种创建变量的方式,内建的 new(T) 函数为一个 T 类型的新项分配了 "零 "存储,并返回其地址,即 *T 类型的值。用 Go 的术语来说,它返回一个指向新分配的 T 类型的零值的指针。

Golang new 和 make 函数_初始化

Golang new() 函数

函数语法:func new(Type) *Type

  • new() 返回的内存是清零的。
  • new() 只返回指向初始化内存的指针。
  • new() 适用于所有的数据类型(除了 channelmap),并为该类型的变量动态分配空间,将其初始化为该类型的零值并返回一个指针。

语法:

result = new(int)

这个语法等同于:

var temp int   // declare an int type variable
var result *int //  declare a pointer to int
result = &temp

有三种不同的方法来创建一个指向零结构值的指针,每种方法都是等价的:

package main

import "fmt"

type Sum struct {
	x_val int
	y_val int
}

func main() {
	// Allocate enough memory to store a Sum structure value
	// and return a pointer to the value's address
	var sum Sum
	p := &sum
	fmt.Println(p)

	// Use a composite literal to perform 
	//allocation and return a pointer
	// to the value's address
	p = &Sum{}
	fmt.Println(p)

	// Use the new function to perform allocation, 
	//which will return a pointer to the value's address.
	p = new(Sum)
	fmt.Println(p)
}

输出:

&{0 0}
&{0 0}
&{0 0}

使用 new() 创建一个变量和先通过 var 初始化一个变量,然后对这个变量取地址没什么不同,唯一的区别是,通过 new() 函数不需要引入变量名称,所以使用上更加简洁、便利。

Golang make() 函数

函数语法:func make(t Type, size ...IntegerType) Type,和new一样,第一个参数是一个类型,而不是一个值。与new不同,make的返回类型与它的参数类型相同,而不是一个指向它的指针。结果的规格取决于类型。

make() 函数是一种特殊的内置函数,只用于初始化切片、map 和通道。 make 返回 T (数据类型)类型的值,而不是 *T。与 new() 函数不同,make() 不会返回一个指针。

make([]int, 10, 20) : make 创建了切片,并根据默认的数据类型值初始化其内容。

new([20]int)[0:10] : 它也将创建片断,但返回指向初始化内存的指针。

- 切片:尺寸指定的是长度。分片的容量是等于它的长度。可以提供第二个整数参数来指定不同的容量。指定一个不同的容量;它必须不小于长度。例如,make([]int, 0, 10) 分配了一个底层数组大小为 10 的底层数组,并返回一个长度为 0、容量为 10 的切片,该切片由底层数组支持。


- map:一个空的 map 被分配了足够的空间来容纳指定数量的元素。大小可以省略,在这种情况下

会分配一个小的起始大小。make(map[int]bool, 10)


- 通道:通道的缓冲区被初始化为指定的缓冲区容量。如果是零,或者省略了大小,通道就会被没有缓冲区。 make(chan int, 5)

package main

import "fmt"

func main() {
	// Using make() to initialize a map.
	m := make(map[string]bool, 0)
	fmt.Println(m)

	// Using a composite literal to initialize a map.
	m = map[string]bool{}
	fmt.Println(m)
}

输出:

map[]
map[]

你也可以使用一个复合字面的初始数据来初始化 map,如下图所示:

m := map[string]bool{
    "java": false,
    "go":   true,
}

推荐阅读:

标签:map,初始化,int,make,Golang,new,fmt
From: https://blog.51cto.com/yuzhou1su/6252631

相关文章

  • new和malloc区别
    new1.调用名为operatornew的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象2.运行该类型的一个构造函数初始化对象3.返回指向新分配并构造的构造函数对象的指针malloc在堆中申请一块内存,返回指向该内存的指针,不会对内存进行初始化 1.new可以在指定内......
  • cmake add to linker from CLI
    CMAKE_EXE_LINKER_FLAGSCMAKE_MODULE_LINKER_FLAGSCMAKE_SHARED_LINKER_FLAGSCMAKE_STATIC_LINKER_FLAGShttps://cmake.org/cmake/help/latest/command/target_link_options.htmlhttps://stackoverflow.com/questions/24532853/how-can-i-add-linker-flag-for-libraries......
  • hashmap oop in golang
    packagemainimport("fmt")constHASH_BUCKET_SIZE=3//1023typehash_nodestruct{keyinterface{}valinterface{}next*hash_node}typeHASH_BUCKET[HASH_BUCKET_SIZE]*hash_nodefunchash(keyinterface{})int{h......
  • Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程
    前言  基于linux的驱动开发学习笔记,本篇是描述了一个字符驱动的基础开发流程,以便做嵌入式开发多年的应用或者系统学习驱动开发。 笔者自身情况  笔者拥有硬件基础,单片机软硬基础,linux系统基础等各种,就是没有linux驱动框架基础,未做过linux系统移植和驱动移植开发了......
  • typora:The beta version of typora is expired, please download and install a newe
    该解决方案摘录自:摘录问题描述typora安装后提示Thebetaversionoftyporaisexpired,pleasedownloadandinstallanewerversion解决方案按Windows+R打开运行窗口,输入regedit,点确定,打开注册表,依次展开计算机\HKEY_CURRENT_USER\Software\Typora,然后在Typora上右键,点......
  • 讯飞星火大模型 与New Bing实测对比
    昨天科大讯飞发布了讯飞星火认知大模型,在发布会现场实测大模型的7种核心能力,并发布了它在教育、办公、汽车、数字员工领域的应用成果。科大讯飞董事长刘庆峰表示:认知大模型展示了通用人工智能的曙光,讯飞星火认知大模型已在文本生成、知识问答、数学能力3种能力上超越ChatGPT。NewB......
  • golang的vscode环境搭建
    因为墙的原因,vscode安装go插件会有报错,需要切换成国内的镜像 GOPROXYhttps://proxy.golang.com.cn,direct ......
  • CF750E - New Year and Old Subsequence
    题意:给一个字符串,每次询问它的一个区间,问最少删除多少个字符,使得区间没有子序列2016,但是有子序列2017。Mysolution首先考虑贪心,通过预处理的方式找到区间最后一个7,依次往前贪心的找到最靠后的一组2017。接下来,我们需要7的后面没有6,7前面的部分不能组合出2016。我们先......
  • Golang基础--加锁与原子操作
    前言在实际项目开发中,有时会面临同一时刻将多个goroutine作用于同一个对象的情况,此时,他们之间会发生冲突,这种情况称为数据竞态问题。例如:packagemainimport("fmt""time")varcountintfuncmain(){goCountPlus(10000)goCountPlus(10000)......
  • golang hashmap
    packagemainimport("fmt")constHASH_BUCKET_SIZE=3//1023typehash_nodestruct{keyinterface{}valinterface{}next*hash_node}//hashbuckettosavenodeaddressvarhash_bucket[HASH_BUCKET_SIZE]*hash_nodefunc......