gpt4 book ai didi

go - 当作为参数传递给单独包中的函数时,结构不是类型

转载 作者:数据小太阳 更新时间:2023-10-29 03:32:36 25 4
gpt4 key购买 nike

我正在制作一个 JSON 验证函数并尝试实现它。但是,当我尝试将它们作为参数导入我的验证函数时,我的结构出现了问题,该验证函数位于另一个包中。

它在另一个包中的原因是因为我将在不同的路由文件中调用一个通用验证函数,所以我实际上不能在该包中包含任何结构,它们必须在路由文件中导入和定义。

type UsersJSON struct {
Users struct {
Put []UserJSON `json:"PUT"`
} `json:"users"`
}

type UserJSON struct {
display_name string `json:"display_name"`
username string `json:"username"`
email string `json:"email"`
password string `json:"password"`
}

func MyFunc(w http.ResponseWriter, r *http.Request) {
errors, _ := schema.Validate(data, r, UsersJSON)
}

func Validate(schemaHelper interface{}) (interface{}, error) {
file, err := os.Open("config/schema/schema.json")
if err != nil {
return nil, err
}

defer file.Close()

byteValue, _ := ioutil.ReadAll(file)

var helpers schemaHelper // this is the error

json.Unmarshal(byteValue, &helpers)
fmt.Printf("%v", helpers)
}

我的 JSON 架构如下所示:

{
"users": {
"PUT": {
}
}
}

我想让这个方法起作用,因为它使自动化验证变得更加容易和快速。

这不会编译并给出错误 schemaHelper is not a type

知道如何解决这个问题吗?

最佳答案

您正在尝试声明一个名为 helpers 的变量,类型为 schemaHelper,但是(至少在显示的代码中)您没有定义任何名为 的类型>架构助手。您有一个名为 schemaHelper变量。您不能将类型用作变量,或将变量用作类型。您必须通过传递 UsersJSON实例 来调用Validate,然后您可以直接将 JSON 解码到其中。看起来您可能正在寻找的是这样的东西:

func MyFunc(w http.ResponseWriter, r *http.Request) {
var unmarshaled UsersJSON
errors, _ := schema.Validate(&unmarshaled)
}

func Validate(schemaHelper interface{}) (error) {
file, err := os.Open("config/schema/schema.json")
if err != nil {
return nil, err
}

defer file.Close()

byteValue, _ := ioutil.ReadAll(file)

return json.Unmarshal(byteValue, schemaHelper)
}

这会将 JSON 解码为变量 schemaHelper(无论它是什么类型),供调用者在其认为合适时使用。请注意,这是一个粗略的最佳猜测,因为在您的问题中,对 Validate 的调用传递了 3 个参数,但给出的函数定义仅接受 1 个参数。

但是,我认为这不会像您根据问题认为的那样进行“验证”。它只验证 JSON 语法上有效,而不是它与您传入的 struct 有任何关系 - 它可能具有结构中未定义的字段,它可能缺少已定义的字段,并且不会返回任何错误。

最后,UsersJSON 类型没有导出字段(所有字段都以小写字母开头,使它们未导出/私有(private)),因此无论如何都不会解码到其中。 encoding/json 只能解码为导出的字段。

关于go - 当作为参数传递给单独包中的函数时,结构不是类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51970372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com