例:
type myType struct {
foo []float64
Name string
}
Run Code Online (Sandbox Code Playgroud)
myType未导出,但导出其中的Name字段.
这样做有意义吗?这被认为是一种不好的做法吗?
我有这样的东西,编译得很好.Name如果我创建一个导出的数组,我可以访问该字段myType
var MyArray []myType = {... some initialization }
fmt.Println(MyArray[0].Name) // Name is visible and it compiles
Run Code Online (Sandbox Code Playgroud)
icz*_*cza 11
具有导出字段的未导出结构是完全有效的.如果类型在另一个包中声明,则声明var MyArray []myType将是编译时错误.
虽然导出的函数具有未导出的返回类型是完全有效的,但使用它通常很烦人.golint工具还会针对此类情况发出警告:
exported func XXX返回未导出类型的pname.tname,这可能很烦人
在这种情况下,最好还输出类型; 或者如果您不想这样做,那么创建一个导出的接口,导出的函数应该具有该接口的返回类型,因此实现类型可能仍然未导出.由于接口不能包含字段(仅限方法),因此可能需要添加一些getter方法.
另请注意,在某些情况下,这正是您想要的:带有导出字段的未导出结构.有时您希望将struct值传递给其他包以进行处理,并且为了使其他包能够访问这些字段,必须将它们导出(但不能导出结构类型本身).
很好的例子是当你想要生成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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3253 次 |
| 最近记录: |