2 回答
TA贡献1831条经验 获得超4个赞
将映射视为包含指向底层映射结构的指针和大小的结构(可能还有其他东西,不确定)。
例如,把它想象成:
struct Map {
data *Entries
size int
}
make,根据传递给make的大小分配Entries的初始值(如果有的话)
当你说:
form.Errors = make(map[string]string)
就像在说:
form.Errors = struct { data : malloc(sizeof(Entries)*capacity), size : 0 }
它将“数据”和“大小”变量复制到您的表单中。错误
实际字段“form.Errors”仍然在内存中的相同位置,form.Errors 的内部值已更改以匹配 make 返回的内容。
所以,当你查看 &form.Errors 时,地址不会改变
至于推送到地图时的 nil 错误,您没有make...
一个 un-maid map 还没有“数据”段,所以你会得到一个 nil 指针错误。
不像做:
var i *int
*i = 5
也会导致 nil 错误
希望这一切都是有道理的,并有助于对混乱有所了解。
TA贡献1847条经验 获得超11个赞
首先,回答你的问题:
来自https://golang.org/pkg/builtin/#make
make 内置函数分配和初始化 slice、map 或 chan(仅)类型的对象 [...]
映射:根据大小进行初始分配,但结果映射的长度为 0。大小可以省略,在这种情况下,分配的起始大小较小。
其次,您发布的代码中没有 goroutines。
第三,make 会初始化地图,您可能不应该在每次HandleErr调用中都使用它,因为它会替换您当前的地图。我认为你想要的可能是一个初始化函数,比如NewErrorHandleror NewForm。它有点适合您的结构。例如:
func NewErrorHandler() ErrorHandler {
return ErrorHandler{make(map[string]string)}
}
最后为什么不能自动初始化地图?如果是这样,您将无法控制地图的初始大小。如果您有关键任务代码并且您希望它快速或低内存并且知道大小,这可能很重要。
附注。还有一种初始化地图的替代方法。如果你想初始化一个空的地图,你可以这样写:map[string]string{}。如果要创建具有初始值的地图:
map[string]string{
"a": "b",
"c": "d",
}
所以你可以编写你的 NewErrorHandler 函数,如:
func NewErrorHandler() ErrorHandler {
return ErrorHandler{map[string]string{}}
}
- 2 回答
- 0 关注
- 207 浏览
添加回答
举报