Go语言中的内存分配与初始化:new与make函数详解

在Go语言中,内存分配和初始化是编程的基础操作。Go提供了两个内置函数newmake,用于不同场景下的内存分配和初始化。理解这两个函数的区别和适用场景对于编写高效、安全的Go代码至关重要。本文将详细介绍newmake函数,并提供示例说明它们的使用。

1. new函数

new函数用于内存分配,它会分配类型T大小的零内存,并返回类型为*T的指针。new函数实际上只做了两件事:分配内存和初始化为零值。

1.1 new函数的特点

  • 分配内存new为类型T分配足够的内存空间。
  • 初始化为零值new将分配的内存初始化为类型T的零值。
  • 返回指针new返回一个指向新分配内存的指针。

1.2 new函数的使用示例

package main

import "fmt"

func main() {
    // 使用new为int类型分配内存
    p := new(int)
    fmt.Println(*p) // 输出: 0,因为int的零值是0

    // 使用new为自定义结构体分配内存
    type Person struct {
        Name string
        Age  int
    }
    pPerson := new(Person)
    fmt.Println(pPerson.Name) // 输出: "",因为string的零值是空字符串
    fmt.Println(pPerson.Age)   // 输出: 0,因为int的零值是0
}

在上面的示例中,new(int)int类型分配了内存,并将其初始化为0。同样,new(Person)Person结构体分配了内存,并将其所有字段初始化为零值。

2. make函数

make函数用于内存分配和初始化,但它只适用于slicemapchan三种内置类型。与new不同,make不仅分配内存,还会初始化这些类型的内部结构,使其可以直接使用。

2.1 make函数的特点

  • 分配内存make为类型T分配足够的内存空间。
  • 初始化make初始化slicemapchan的内部结构,使其可以直接使用。
  • 返回引用类型make返回一个类型为T的引用。

2.2 make函数的使用示例

package main

import "fmt"

func main() {
    // 使用make为slice分配内存并初始化
    s := make([]int, 5)
    fmt.Println(s) // 输出: [0 0 0 0 0],因为int的零值是0

    // 使用make为map分配内存并初始化
    m := make(map[string]int)
    m["key"] = 42
    fmt.Println(m) // 输出: map[key:42]

    // 使用make为chan分配内存并初始化
    ch := make(chan int)
    fmt.Println(ch) // 输出: chan int (0),表示一个空的int类型channel
}

在上面的示例中,make([]int, 5)int类型的slice分配了内存,并将其初始化为包含5个0slicemake(map[string]int)map分配了内存,并初始化为一个空的mapmake(chan int)chan分配了内存,并初始化为一个空的int类型channel

3. new与make的区别

  • 适用类型new适用于所有类型,而make仅适用于slicemapchan
  • 返回类型new返回一个指向新分配内存的指针,而make返回一个引用类型。
  • 初始化new只将内存初始化为零值,而make还会初始化类型的内部结构。

4. 总结

newmake是Go语言中用于内存分配和初始化的两个重要函数。new适用于所有类型,分配内存并初始化为零值,返回一个指针。make仅适用于slicemapchan,分配内存并初始化内部结构,返回一个引用类型。理解这两个函数的区别和适用场景,可以帮助你更有效地管理Go程序中的内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式:7、策略模式(政策)

目录 0、定义 1、策略模式的三种角色 2、策略模式的UML类图 3、示例代码 0、定义 定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 1、策略模式的三种角色 策略(Strategy&…

3、集线器、交换机、路由器、ip的关系。

集线器、交换机、路由器三者的关系 1、集线器2、交换机(每个交换机是不同的广播域,ip地址起到划分广播域的作用)3、 路由器4、ip地址 1、集线器 一开始两台电脑通信就需要网线就可以,但是三台或者更多主机通信时,就需…

mfc100u.dll是什么?分享几种mfc100u.dll丢失的解决方法

mfc100u.dll 是一个动态链接库(DLL)文件,属于 Microsoft Foundation Classes (MFC) 库的一部分。MFC 是微软公司开发的一套用于快速开发 Windows 应用程序的 C 类库。mfc100u.dll 文件包含了 MFC 库中一些常用的函数和类的定义,这…

魔众题库系统 v10.0.0 客服条、题目导入、考试导航、日志一大批更新

魔众题库系统基于PHP开发,可以用于题库管理和试卷生成软件,拥有极简界面和强大的功能,用户遍及全国各行各业。 魔众题库系统发布v10.0.0版本,新功能和Bug修复累计30项,客服条、题目导入、考试导航、日志一大批更新。 …

opencv-python 分离边缘粘连的物体(距离变换)

import cv2 import numpy as np# 读取图像,这里添加了判断图像是否读取成功的逻辑 img cv2.imread("./640.png") # 灰度图 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊 gray cv2.GaussianBlur(gray, (5, 5), 0) # 二值化 ret, binary cv2…

YOLO-FaceV2: A Scale and Occlusion Aware Face Detector

《YOLO-FaceV2:一种尺度与遮挡感知的人脸检测器》 1.引言2.相关工作3.YOLO-FaceV23.1网络结构3.2尺度感知RFE模型3.3遮挡感知排斥损失3.4遮挡感知注意力网络3.5样本加权函数3.6Anchor设计策略3.7 归一化高斯Wasserstein距离 4.实验4.1 数据集4.2 训练4.3 消融实验4.3.1 SEAM块4…

CMake笔记:install(TARGETS target,...)无法安装的Debug/lib下

1. 问题描述 按如下CMake代码,无法将lib文件安装到Debug/lib或Release/lib目录下,始终安装在CMAKE_INSTALL_PREFIX/lib下。 install(TARGETS targetCONFIGURATIONS DebugLIBRARY DESTINATION Debug/lib) install(TARGETS targetCONFIGURATIONS Release…

网络编程 day1.2~day2——TCP和UDP的通信基础(TCP)

笔记脑图 作业&#xff1a; 1、将虚拟机调整到桥接模式联网。 2、TCP客户端服务器实现一遍。 服务器 #include <stdio.h> #include <string.h> #include <myhead.h> #define IP "192.168.60.44" #define PORT 6666 #define BACKLOG 20 int mai…

[Flux.jl] 非线性回归的拟合

调用第三方库 using Flux, Random using Plots设置随机种子以确保结果的可重复性 Random.seed!(1)生成数据集 x_data rand(Float32, 500) *20 .- 10 # 生成100个随机x值&#xff0c;范围在0到20之间 y_data sin.(x_data) ./ x_data # 生成y值 y_data reshape(y_data, …

如何创建一个项目用于研究element-plus的原理

需求&#xff1a;直接使用element-plus未封装成组件的源码&#xff0c;创建一个项目&#xff0c;可以使用任意的element-plus组件&#xff0c;可以深度研究组件的运行。例如研究某一个效果&#xff0c;如果直接在node_modules修改elment-plus打包之后的那些js、mjs代码&#xf…

借助算力云跑模型

算力平台&#xff1a;FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤&#xff08;因为我也不熟练&#xff09;。 【注】&#xff1a;进入平台&#xff0c;注册登录账号后&#xff0c;才能租用。学生认证&#xff0b;实名认证会有免费的算力资源&#xff0…

C语言:函数指针精讲

1、函数指针 一个函数总是占用一段连续的内存区域&#xff0c;函数名在表达式中有事也会被转换为该函数所在内存区域的首地址&#xff0c;这和数组名非常类似&#xff0c;我们可以把函数这个首地址&#xff08;或称入口地址&#xff09;赋予一个指针变量&#xff0c;使指针变量…

CPU命名那些事

一、Intel CPU命名 1. 命名结构 Intel CPU 的命名通常包含以下几个部分&#xff1a; 品牌 产品线 系列 代数 具体型号 后缀 例如&#xff1a;Intel Core i7-13700K 2. 各部分含义 品牌 Intel&#xff1a;表示厂商&#xff08;几乎所有命名中都有&#xff09;。不同品…

几个bev模型部署常用的命令

python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --version v1.0-mini ##迷你版数据集 python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscen…

Vue3-小兔鲜项目出现问题及其解决方法(未写完)

基础操作 &#xff08;1&#xff09;使用create-vue搭建Vue3项目 要保证node -v 版本在16以上 &#xff08;2&#xff09;添加pinia到vue项目 npm init vuelatest npm i pinia //导入creatPiniaimport {createPinia} from pinia//执行方法得到实例const pinia createPinia()…

Halo 正式开源: 使用可穿戴设备进行开源健康追踪

在飞速发展的可穿戴技术领域&#xff0c;我们正处于一个十字路口——市场上充斥着各式时尚、功能丰富的设备&#xff0c;声称能够彻底改变我们对健康和健身的方式。 然而&#xff0c;在这些光鲜的外观和营销宣传背后&#xff0c;隐藏着一个令人担忧的现实&#xff1a;大多数这些…

鸿蒙NEXT开发案例:随机数生成

【引言】 本项目是一个简单的随机数生成器应用&#xff0c;用户可以通过设置随机数的范围和个数&#xff0c;并选择是否允许生成重复的随机数&#xff0c;来生成所需的随机数列表。生成的结果可以通过点击“复制”按钮复制到剪贴板。 【环境准备】 • 操作系统&#xff1a;W…

Linux 下的IO模型

一&#xff1a;四种IO模 1.1&#xff1a;阻塞式IO&#xff08;最简单&#xff0c;最常用&#xff0c;效率最低&#xff09; 阻塞I/O 模式是最普遍使用的I/O 模式&#xff0c;大部分程序使用的都是阻塞模式的I/O 。 缺省情况下&#xff08;及系统默认状态&#xff09;&#xf…

深度可观察性:它是什么,为什么我们需要它?

随着混合云基础设施成为现代企业的支柱&#xff0c;威胁形势的发展速度比以往任何时候都快。 越来越老练的攻击者、隐藏的漏洞和复杂的监管要求使 IT 和安全团队更难确保在这个复杂的环境中提供强大的保护。 2024 年 Gigamon 混合云安全调查显示&#xff0c;安全和 IT 领导者…

【附代码原理】偏正态分布的数据处理方法

文章目录 相关教程基本信息数学定义参数的影响Python 实现安装 scipy生成和绘制偏正态分布的数据 解释应用 右偏&#xff08;即长尾在右侧&#xff09;的正态分布1. 对数变换 (Log Transformation)2. 平方根变换 (Square Root Transformation)3. Box-Cox 变换注意事项 左偏&…