Go 语言 中make和new关键字的区别

在Go语言的世界里,有两个非常贴心的助手,

它们可以帮助我们创建和准备各种各样的数据结构,

这两个助手的名字叫做 make 和 new。

虽然它们都是用来帮助我们分配内存的,但是它们各自擅长的事情却有所不同。

首先,让我们来认识一下 new。

new 是一个非常简单的家伙,它只做一件事情:

为我们想要的数据类型分配一块全新的内存空间,并且返回一个指向这片空间的指针。

这个指针指向的地方,会自动填充该类型的默认值,也就是零值。

想象一下,new 就像一个忠实的管家,你告诉他你需要一个特定类型的新房间,他就会为你准备好,并把钥匙(指针)交给你。

举个例子,假设我们有一个表示学生的结构体 Student,我们想要为它创建一个新的实例,就可以请 new 出马了:

type Student struct {
  name string
  age int
}

var s *Student
s = new(Student) // new帮我们分配了内存,并返回了指向这片内存的指针
s.name = "小明" // 我们给这个学生起了个名字叫小明

fmt.Println(s)

如果我们忘记使用 new,那么程序在运行时就会遇到麻烦,因为它不知道要把数据放在哪里,就像是试图进入一个不存在的房间一样。

接下来,我们再来聊聊 make。

make 是一个更专业的助手,它专注于创建和初始化 Go 语言中的三种特殊数据结构:切片(slice)、映射(map)和通道(channel)。

make 的工作不仅仅是分配内存,它还会确保这些数据结构被正确地初始化,这样我们就可以直接使用了。

和 new 不同,make 返回的不是指针,而是这些数据结构本身,因为它们本身就是引用类型,就像是一扇已经打开的门,我们直接走进去就好了。

例如,我们想要创建一个装有三个字符串的切片,就可以这样使用 make:

// 使用make创建一个字符串切片,并告诉它我们想要三个位置
mySlice := make([]string, 3)
mySlice[0] = "语文" // 我们可以立刻开始使用这个切片
mySlice[1] = "数学"
mySlice[2] = "英语"

fmt.Println(mySlice)

简单来说,new 和 make 都是帮助我们创建数据结构的助手,但是它们各有专长。

new 更适合于创建基本类型的数据,并返回一个指向这些数据的指针;

而 make 则是 slice、map 和 channel 的好朋友,它不仅分配内存,还负责初始化,让我们可以直接使用这些数据结构。

2024-05-01

一个go写的端口检测的小工具

就2个文件,一个是ips.txt,每行一个ip:端口

IP列表文件:

127.0.0.1:8000
127.0.0.1:9000

2024-04-02

Windows11 Copilot助手开启教程

Copilot介绍

Windows Copilot 是 Windows 11 中的一个新功能,它可以让你与一个智能助理进行对话,获取信息,执行任务,甚至创造内容。Windows Copilot 使用了 Bing Chat 的技术,它是一个基于 OpenAI 的 GPT-4 模型的聊天机器人,可以理解自然语言,回答问题,生成图片,写作,编程等等。

国内现状

由于各种神秘的原因,在国内是不可以用的,包括新版本的EDGE,访问

edge://settings/sidebar/appSettings?hubApp=cd4688a9-e888-48ea-ad81-76193d56b1be

虽然全部显示开启,但是依然是灰色不可用....

2024-03-14

给hexo加入gemini娘 一 准备篇

谷歌新一代AI:Gemini发布有一段日子了,免费1分钟能调用60次,1月免费调用1000次,很慷慨了。
我也跟着冰剑学习了一下,
开始利用大善人cloudflare(简称cf)让HEXO也白嫖Gemini娘...

今天先说准备...

2024-02-16

在HEXO博客中加入Gemini娘评价功能的探索

冰剑的gemini

冰剑的博客中,我看到了一个非常有意思的功能——Gemini娘评价。

这是一个基于php的服务端语言实现的功能,可以直接读取并显示在博客上。

而我使用的是HEXO,一种静态语言,所以实现这个功能需要一些其他的步骤。

我去看了谷歌gemini的主页: makersuite.google.com

免费额度:

旧:

  • 300条/月,读取60次/分钟

新(自2024-02-13日起):

  • 1000条/月,读取60次/分钟

太良心了....

因为要存储,我想到了一个办法,那就是使用Cloudflare服务来实现这个功能。

这样,每当我更新博客或者发布新文章时,只需要在给worker提交一下数据,

就可以在提交新文章中,让worker自己去拿到Gemini娘评价,然后存在缓存中。

然后,在前台读取就好啦,再用AI给GEMINI画个头像~~

搞定效果见文章末尾...

PS. 代码目前正在测试中,修复一下之后分享出来~~

2024-02-13