未导出的struct最佳实践? (golint抱怨)

时间:2016-05-03 18:50:50

标签: go

我有以下套餐:

package mypkg

type (
    // mystruct ...
    mystruct struct {
        S string
    }
)

// New ..
func New() *mystruct {
    return &mystruct{S: "test"}
}

我这样使用它:

package main

import (
    "fmt"
    "test/mypkg"
)

func main() {
    x := mypkg.New()
    fmt.Println(x.S)
    // this fails intended
    y := mypkg.mystruct{S: "andre"}
    fmt.Println(y.S)
}

为什么golint抱怨我的未导出的结构?我的意图是阻止在构造函数调用之外调用结构创建。 是否有另一种方法可以防止在没有新呼叫的情况下进行实例化?

1 个答案:

答案 0 :(得分:1)

main.main()中的x := mypkg.New()甚至不能有任何类型。它甚至不应该编译。它无法使用。在我看来更有意义的是像

package mypkg
type (
    // mystruct ...
    mystruct struct {
        S string
    }
)
type HaveS interface{ //which you can use but can't instantiate
    GetS() string
}
func (strct *mystruct ) GetS() string {return strct.S}
// New ..
func New() HaveS {
    return &mystruct{S: "test"}
}

然后在主

var x mypkg.HaveS
x = mypkg.New()
fmt.Println(x.GetS())