我有以下套餐:
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抱怨我的未导出的结构?我的意图是阻止在构造函数调用之外调用结构创建。 是否有另一种方法可以防止在没有新呼叫的情况下进行实例化?
答案 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())