gpt4 book ai didi

go - 如何禁止直接结构初始化

转载 作者:IT王子 更新时间:2023-10-29 01:22:55 35 4
gpt4 key购买 nike

给定 Go 中的以下包,是否可以防止使用 Bar{..} 直接初始化 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}
}

主要:

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)
}

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

最佳答案

无法阻止 Bar{}Bar{A: "foo"}

要以您希望的方式控制结构,您可以返回一个接口(interface)而不是导出结构本身。

给出的例子:

package bar

type 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}
}

关于go - 如何禁止直接结构初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26462043/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com