在 Go 中创建地图时是否涉及临时的匿名对象?

Is there a temporary, anonymous object involved in creating maps in Go?

提问人:StoneThrow 提问时间:10/21/2023 最后编辑:StoneThrow 更新时间:10/21/2023 访问量:84

问:

我主要在 C/C++ 中开发很长时间后,正在学习 Go。所以我仍然倾向于将 Go 语法类比为 C/C++。

我的 Go 导师(ChatGPT :( )告诉我,这就是你在 Go 中创建 + 初始化映射(从 string 到 int)的方式:

var foo = map[string]int{}

var foo = make(map[string]int)

在我偏向于 C/C++ 的眼中,看起来像默认初始化变量的使用是从 类型的临时匿名对象分配的。
(ChatGPT 没有做出令我满意的解释,但它仍然“看起来”隐含地涉及一个临时的匿名对象,因为 assigned to 返回了一个假定的对象
=foomap[string]intmake()make()foo=)

我的问题是:
上面的两个语句是否涉及临时匿名对象的赋值?
如果是,(如何)在不涉及任何临时匿名对象的情况下在 Go 中实例化(和默认初始化)对象?
map

我尝试过的:
以下两种方法在 Go 中似乎都无效:

var foo map[string]int
var foo map[string]int{}

我将此 Go 语法类比为 C++ 的“等效项”

std::map<string, int> foo;

与。

std::map<string, int> foo = map<string, int>();
C++ Go 构造函数 Temporary-Objects 匿名对象

评论

7赞 user4581301 10/21/2023
请记住,Chat GPT 是一种语言模型,而不是真正的 AI,它建模的语言也不是 Go。我不会再相信 Chat GPT,就像我能扔掉它一样。
7赞 user229044 10/21/2023
与其使用 ChatGPT,不如购买和阅读 gopl.io。这是一个更好的导师,会教你一些真正正确的东西,而不是偶然正确的东西。
3赞 user17732522 10/21/2023
C++ 代码不使用任何赋值。它也不会创建任何临时对象(从 C++17 开始保证,之前可以选择)。这也是初始化,而不是默认初始化
1赞 hobbs 10/21/2023
你从哪里得到无效的想法?它不是很有(你不能对一个持有 nil 的 map 变量做任何事情,除非赋值,将其与 nil 进行比较,并得到它的 len 为 0),但它是 100% 合法的。var foo map[string]int

答:

1赞 user229044 10/21/2023 #1

var x = y(或 ) 是声明变量并使用 Go 中的值初始化它的方式。您要查找的替代语法不存在,并且此处没有创建“临时变量”。x := y

寻找 C++ 的类似物是没有用的。映射不是 C++ 类。它是通过引用“复制”的。

即使运行以下代码...

var m1 = map[string]int{}
var m2 = m1

...你仍然没有复制任何东西。