douguo6472 2017-10-17 07:35
浏览 253
已采纳

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

Example:

type myType struct {
    foo    []float64
    Name   string
}

myType is not exported, but Name field in it is exported.

Does this make sense to do this? Is that considered a bad practice?

I have something like this, and it compiles fine. I can access the Name field if I create an exported array of myType:

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

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

1条回答 默认 最新

  • dtwr2012 2017-10-17 09:02
    关注

    It is perfectly valid to have unexported structs with exported fields. If the type is declared in another package, the declaration var MyArray []myType would be a compile-time error.

    While it is perfectly valid to have an exported function with an unexported return type, it is usually annoying to use. The golint tool also gives a warning for such cases:

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

    In such cases it's better to also export the type; or if you can't or don't want to do that, then create an exported interface and the exported function should have a return type of that interface, and so the implementing type may remain unexported. Since interfaces cannot have fields (only methods), this may require you to add some getter methods.

    Also note that in some cases this is exactly what you want: unexported struct with exported fields. Sometimes you want to pass the struct value to some other package for processing, and in order for the other package to be able to access the fields, they must be exported (but not the struct type itself).

    Good example is when you want to generate a JSON response. You may create an unexported struct, and to be able to use the encoding/json package, the fields must be exported. For example:

    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
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛