gpt4 book ai didi

go - 未导出结构中的导出字段

转载 作者:IT王子 更新时间:2023-10-29 01:24:03 28 4
gpt4 key购买 nike

例子:

type myType struct {
foo []float64
Name string
}

myType 没有被导出,但是其中的 Name 字段被导出。

这样做有意义吗?这被认为是一种不好的做法吗?

我有这样的东西,它编译得很好。如果我创建一个导出的 myType 数组,我可以访问 Name 字段:

var MyArray []myType = {... some initialization }

fmt.Println(MyArray[0].Name) // Name is visible and it compiles

最佳答案

具有导出字段的未导出结构是完全有效的。如果该类型在另一个包中声明,声明 var MyArray []myType 将是编译时错误。

虽然具有未导出返回类型的导出函数是完全有效的,但使用起来通常很烦人。 golint 工具也会对这种情况给出警告:

exported func XXX returns unexported type pname.tname, which can be annoying to use

在这种情况下,最好也导出类型;或者,如果您不能或不想这样做,则创建一个导出的接口(interface),并且导出的函数应该具有该接口(interface)的返回类型,因此实现类型可能保持未导出。由于接口(interface)不能有字段(只有方法),这可能需要您添加一些 getter 方法。

另请注意,在某些情况下,这正是您想要的:具有导出字段的未导出结构。有时您想将结构值传递给其他包进行处理,为了让其他包能够访问这些字段,必须导出它们(但不是结构类型本身)。

很好的例子是当您想要生成 JSON 响应时。您可以创建一个未导出的结构,并能够使用 encoding/json包,字段必须导出。例如:

type response struct {
Success bool `json:"success"`
Message string `json:"message"`
Data string `json:"data"`
}

func myHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
resp := &response{
Success: true,
Message: "OK",
Data: "some data",
}
if err := json.NewEncoder(w).Encode(resp); err != nil {
// Handle err
}
}

关于go - 未导出结构中的导出字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46784857/

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