给出这段代码:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
alice := Person{Name: "Alice", Age: 17}
fmt.Printf("alice struct is %v", alice)
}
一切都很好,因为名字是一个字符串,年龄是一个整数。
但是如果出现问题,我们会这样做:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
bob := Person{Name: 99, Age: "Bob"}
fmt.Printf("bob struct is %v", bob)
}
然后程序无法构建,出现恐慌等情况。
处理此错误的可能性的正确方法是什么?
我做不到
bob,err := Person{Name: 99, Age: "Bob"}
并在继续之前检查是否有错误。
虽然没有强制执行,但拥有一个构造函数方法被认为是一个很好的做法,该方法用于返回对象,并且您可以在其中包含验证逻辑。
例如:
type Person struct {
Name string
Age int
}
func NewPerson(name string, age int) (*Person, error) {
if age < 0 {
return nil, fmt.Errorf(“age must be greater than zero, %d given”, age)
}
if name == “” {
return nil, fmt.Errorf(“the person must have a name!”)
}
return &Person{Name: name, Age: age}, nil
}
这样就可以了
bob, err := NewPerson(“bob”, 69)
if err != nil {
fmt.Errorf(“error creating new person - %w”, err)
}