如何禁止直接结构初始化

鉴于 Go 中的以下包,是否可以防止Barwith的直接初始化 Bar{..}而不Bar从包中取消暴露?


包bar:


package bar


import ()


type Bar struct {

    A string

    B string

}


func NewBar(baz string) Bar{

    return Bar{A:baz, B:baz+baz}

}

包main:


package main


import (

    "fmt"


    "./bar"

)


func main() {

    x := bar.NewBar("sad") //all bars should be created with this

    y := bar.Bar{A: "fadss"} //and this should be disallowed

    bzzBar(x)

    bzzBar(y)

}


func bzzBar(bzz bar.Bar) { //but I can't do 'Bar -> bar' because I want to use the type

    fmt.Println(bzz)

}

我的直觉说这是不可能的,所以这也是一个有效的答案。


小怪兽爱吃肉
浏览 178回答 3
3回答

忽然笑

没有办法阻止Bar{}或Bar{A: "foo"}。要以您想要的方式控制结构,您可以返回一个接口而不是导出结构本身。给出的例子:package bartype Bar interface{    A() string    B() string    // if you need setters    SetA(string)    SetB(string)}type bar struct {    a string    b string}func (b *bar) A() string { return b.a }func (b *bar) B() string { return b.b }func (b *bar) SetA(val string) { b.a = val }func (b *bar) SetB(val string) { b.b = val }func NewBar(baz string) Bar {    return &bar{a:baz, b:baz+baz}}

慕运维8079593

您可以不Bar导出所有字段并为它们提供 getter 和 setter。这样打包用户仍然可以做一些愚蠢的事情,比如a := Bar{}b := Bar{"foo"}两者都没有或似乎有用(尽管前者可用于创建Bar类似于的空&bytes.Buffer{})。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go