加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang中未导出结构中的导出字段

发布时间:2020-12-16 19:03:52 所属栏目:大数据 来源:网络整理
导读:例: type myType struct { foo []float64 Name string} 不导出myType,但导出其中的“名称”字段. 这样做有意义吗?这被认为是一种不好的做法吗? 我有这样的东西,编译得很好. 如果我创建一个myType的导出数组,我可以访问Name字段 var MyArray []myType = {.
例:
type myType struct {
    foo    []float64
    Name   string
}

不导出myType,但导出其中的“名称”字段.

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

我有这样的东西,编译得很好.
如果我创建一个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

在这种情况下,最好还输出类型;或者如果您不想这样做,那么创建一个导出的接口,导出的函数应该具有该接口的返回类型,因此实现类型可能仍然未导出.由于接口不能包含字段(仅限方法),因此可能需要添加一些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
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读