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 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。