我有一个将用go编写的项目,它在一个结构中有超过30个字段,在允许设置值之前需要验证这些字段。在python中,我可能会使用描述符或至少使用属性来执行此操作,以尽可能避免样板代码。我的问题是在go中执行此操作的最佳方法通常是什么?只是在结构中使用小写变量并为每个属性设置get和set函数,还是有更好的方法来防止样板代码? 最佳答案 来自godocs:Godoesn'tprovideautomaticsupportforgettersandsetters.There'snothingwrongwithprovidinggettersa
我有一个定义如下的支柱typeReqJSONstruct{Requeststruct{Datastruct{Objectstruct{User[]User`json:"user"`}`json:"object"`}`json:"data"`}`json:"request"`}typeUserstruct{UserIDstring`json:"userid"`IPAddrstring`json:"ipaddr"`Noofusersstring`json:"noofusers"`Qosstring`json:"qos"`IDstring`json:"id"`Domainstring`jso
我有一个定义如下的支柱typeReqJSONstruct{Requeststruct{Datastruct{Objectstruct{User[]User`json:"user"`}`json:"object"`}`json:"data"`}`json:"request"`}typeUserstruct{UserIDstring`json:"userid"`IPAddrstring`json:"ipaddr"`Noofusersstring`json:"noofusers"`Qosstring`json:"qos"`IDstring`json:"id"`Domainstring`jso
我刚刚开始学习Go,这里有一些我无法完全理解的行为:packagemainimport"fmt"typeMessageinterface{SetSender(senderstring)}typemessagestruct{senderstring}typeJoinstruct{messageChannelstring}func(mmessage)SetSender(senderstring){m.sender=sender}funcmain(){varmsgMessagemsg=Join{}msg.SetSender("Jim")fmt.Printf("%s",msg)}这会打印{{}
我刚刚开始学习Go,这里有一些我无法完全理解的行为:packagemainimport"fmt"typeMessageinterface{SetSender(senderstring)}typemessagestruct{senderstring}typeJoinstruct{messageChannelstring}func(mmessage)SetSender(senderstring){m.sender=sender}funcmain(){varmsgMessagemsg=Join{}msg.SetSender("Jim")fmt.Printf("%s",msg)}这会打印{{}
我是go语言的新手,在使用getter和setter为来自不同文件的结构指定接口(interface)时遇到问题。来源src/github.com/user/interfacespackageinterfacestypeIFoointerface{Name()stringSetName(namestring)}src/github.com/user/foopackagefooimport"github.com/user/interfaces"typeFoostruct{namestring}func(f*interfaces.IFoo)SetName(namestring){f.nam
我是go语言的新手,在使用getter和setter为来自不同文件的结构指定接口(interface)时遇到问题。来源src/github.com/user/interfacespackageinterfacestypeIFoointerface{Name()stringSetName(namestring)}src/github.com/user/foopackagefooimport"github.com/user/interfaces"typeFoostruct{namestring}func(f*interfaces.IFoo)SetName(namestring){f.nam
给定这个短程序:packagemainimport"fmt"typeFoostruct{doerfunc()}func(fFoo)SetDoer(doerfunc()){f.doer=doer}funcmain(){foo:=Foo{func(){fmt.Println("original")}}foo.doer()foo.SetDoer(func(){fmt.Println("replacement")})foo.doer()}输出是:originaloriginal我原以为是:originalreplacement为什么不是呢?请注意,如果我直接在main()中设置foo.doer
给定这个短程序:packagemainimport"fmt"typeFoostruct{doerfunc()}func(fFoo)SetDoer(doerfunc()){f.doer=doer}funcmain(){foo:=Foo{func(){fmt.Println("original")}}foo.doer()foo.SetDoer(func(){fmt.Println("replacement")})foo.doer()}输出是:originaloriginal我原以为是:originalreplacement为什么不是呢?请注意,如果我直接在main()中设置foo.doer
在EffectiveGo中,它是clearlystated在未导出字段(以小写字母开头)的情况下,getter方法应具有相同的字段名称但以大写字母开头;他们给出的示例是owner作为字段,Owner作为方法。他们明确建议不要在getter方法名称前使用Get。我经常遇到需要导出字段以进行JSON编码、与ORM一起使用或其他与反射相关的目的(IIRC反射可以读取但不能修改未导出的字段)的情况,因此我的字段需要被称为Owner在上面的例子中,因此不能有Owner方法。是否有一种惯用的命名方式可以解决这种情况?编辑:这是我遇到的具体示例:typeUserstruct{Usernamestri