如何在Golang中捕获示例化Type的错误?[已关闭]

nqwrtyyt  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(90)

已关闭,此问题需要details or clarity。它目前不接受回答。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

2天前关闭。
Improve this question

编辑:* 虽然我给出的例子发生在main中并且是硬编码的,但这是一个非常简单的例子。

  • 在真实的世界中,不良数据可能随时从多种来源进入:Web表单、命令行、配置文件等 *
  • 请帮助我解决一般问题,而不是我非常狭窄的示例中的代码。

给定此代码:

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)
}

一切都很好,因为名称是一个字符串,年龄是一个int。
但如果出了什么问题,我们这样做:

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"}

并在继续之前检查错误。

mv1qrgav

mv1qrgav1#

虽然没有强制执行,但使用构造函数方法被认为是一个很好的实践,该方法用于返回对象,并且可以在其中包含验证逻辑。
举例来说:

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)
}

相关问题