英文:
Pointer to a map
问题
将一些映射定义为:
var valueToSomeType = map[uint8]someType{...}
var nameToSomeType = map[string]someType{...}
我想要一个指向这些映射地址的变量(以免复制所有变量)。我尝试使用:
valueTo := &valueToSomeType
nameTo := &nameToSomeType
但是在使用valueTo[number]
时,显示出以下错误:
internal compiler error: var without type, init: new
如何解决这个问题?
编辑
这个错误是由另一个问题引起的。
英文:
Having some maps defined as:
var valueToSomeType = map[uint8]someType{...}
var nameToSomeType = map[string]someType{...}
I would want a variable that points to the address of the maps (to don't copy all variable). I tried it using:
valueTo := &valueToSomeType
nameTo := &nameToSomeType
but at using valueTo[number]
, it shows
internal compiler error: var without type, init: new
How to get it?
Edit
The error was showed by another problem.
答案1
得分: 179
地图是引用类型,因此它们总是通过引用传递。你不需要一个指针。Go文档
英文:
Maps are reference types, so they are always passed by reference. You don't need a pointer. Go Doc
答案2
得分: 53
更具体地说,根据Golang规范:
> 切片、映射和通道是引用类型,不需要使用new
进行额外的间接分配。
内置函数make
接受一个类型T
,该类型必须是切片、映射或通道类型,可选择跟随一个特定于类型的表达式列表。
它返回一个类型为T
的值(不是*T
)。
内存的初始化如初始值部分所述。
然而,关于函数调用,参数总是通过值传递进行传递。
除非映射参数的值是一个指针。
英文:
More specifically, from the Golang Specs:
> Slices, maps and channels are reference types that do not require the extra indirection of an allocation with new
.
The built-in function make takes a type T
, which must be a slice, map or channel type, optionally followed by a type-specific list of expressions.
It returns a value of type T
(not *T
).
The memory is initialized as described in the section on initial values
However, regarding function calls, the parameters are passed by value (always).
Except the value of a map parameter is a pointer.
答案3
得分: 8
@Mue的答案是正确的。
以下是足够验证的简单程序:
package main
import "fmt"
func main() {
m := make(map[string]string, 10)
add(m)
fmt.Println(m["tom"]) // 期望为nil ???
}
func add(m map[string]string) {
m["tom"] = "voldemort"
}
这个程序的输出是
voldemort
如果将map按值传递,那么在add()函数中对map的添加不会对main方法产生任何影响。但是我们看到了add()方法添加的值。这证实了map的指针被传递给了add()方法。
英文:
@Mue 's answer is correct.
Following simple program is enough to validate:
package main
import "fmt"
func main() {
m := make(map[string]string, 10)
add(m)
fmt.Println(m["tom"]) // expect nil ???
}
func add(m map[string]string) {
m["tom"] = "voldemort"
}
The output of this program is
voldemort
Tf the map was passed by value, then addition to the map in the function add() would not have any effect in the main method. But we see the value added by the method add(). This verifies that the map's pointer is passed to the add() method.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论