我是 Go 的新手,几天前一直在寻找有关表单的教程,现在我对自己有了更多的熟悉,我试图创建自己的错误处理程序,我可以将它用于我的所有结构,有点就像一个抽象类,但我从教程中得到的例子让我有点难倒。
这是我用来测试make函数在做什么的一个小例子。我通过修补弄明白了它,但我不明白它实际上在做什么,以及为什么它是必要的。
type ErrorHandler struct {
Errors map[string]string
}
type Form struct {
ErrorHandler
}
func main() {
form := &Form{}
if true {
fmt.Printf("%p\n", &form.Errors)
} else {
form.Errors = make(map[string]string)
fmt.Printf("%p\n", &form.Errors)
}
}
在上面的示例中,我尝试将 if 语句从 true 更改为 false 以查看内存地址是否根据是否使用该make函数而发生变化,并且在两种情况下它都保持不变。我在这里阅读了答案,他说它的一个用途是“创建一个预先分配了空间的地图”——老实说这对我来说意义不大,因为我是指针和所有这些的新手,但是“创建一个地图“部分让我认为这就像在 ErrorHandler 结构中重新初始化 Errors 映射,这会将它分配给一个新的内存地址,是吗?但是不,它们保持不变。
所以我尝试在地图中创建一个值,一次没有使用 make 函数,一次使用make 函数。该if条件给了我一个错误说assignment to entry in nil map和goroutine [running],和else语句打印“哈哈”,这是我将它设置为:
type ErrorHandler struct {
Errors map[string]string
}
type Form struct {
ErrorHandler
}
func main() {
form := &Form{}
if true {
form.Errors["blah"] = "haha"
fmt.Printf(form.Errors["blah"])
} else {
form.Errors = make(map[string]string)
form.Errors["blah"] = "haha"
fmt.Printf(form.Errors["blah"])
}
}
所以我有点了解 make 函数在做什么,但不完全是。据我所知,是否要将项目“推送”到该地图中,我需要使用该make功能,但我不明白为什么有必要。为什么map[string]string在我的结构中设置为 nil,因为当我打印出来时,我看到的是“map[]”而不是“nil”……这很令人困惑。
有人可以解释一下吗?这goroutine在这里是如何使用的?也许这就是我正在寻找的答案......以前从未使用过。
另外,由于我必须使用make,有没有办法让它自动发生,而不必将它放在每个方法的顶部?
例如,在我的 ErrorHandler 结构中,我有一个如下所示的方法:
func (this *ErrorHandler) HandleErr(err string) {
this.Errors = make(map[string]string)
this.Errors["Error"] = err
}
并且在我的 Form 结构中,我还有另一种验证表单的方法,但也使用了方法顶部的 `this.Errors = make(map[string]string) ......对我来说感觉不干。
任何帮助是极大的赞赏。
慕容708150
回首忆惘然
相关分类