我最近进入Go并看到了很多关于如何进行错误处理的讨论.
我看到的模式如下:
err := DoSomething()
if err != nil {
//handle
}
// continue
Run Code Online (Sandbox Code Playgroud)
经常在管理amqp连接时,我的条件是我只想在错误为nil时继续,因为那时我需要在连接上做一些事情:
c, err := Connect()
if err != nil {
return nil, err
}
s,err := c.RegisterSomethingOnConnection()
if err != nil {
return nil, err
}
val, err := s.DoSomething()
return val, err
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,c.RegisterSomethingOnConnection如果返回的错误Connect()是nil,我只想运行该行.
但是,由于提前退货,我不喜欢上述情况.早期的回报让我感到不舒服,因为从长远来看,它会损害可读性,并且在功能退出时会完全模糊.到目前为止,我的解决方案是执行以下操作:
var err error
var val ReturnType
c,err := Connect()
if err == nil {
s,err := c.RegisterSomethingOnConnection()
if err == nil {
val,err = s.DoSomething()
}
} …Run Code Online (Sandbox Code Playgroud) 我真的想要一种在go中打印字段名称的字符串表示的方法.它有几个用例,但这里有一个例子:
假设我有一个结构
type Test struct {
Field string `bson:"Field" json:"field"`
OtherField int `bson:"OtherField" json:"otherField"`
}
Run Code Online (Sandbox Code Playgroud)
并且,例如,我想做一个mongo find:
collection.Find(bson.M{"OtherField": someValue})
Run Code Online (Sandbox Code Playgroud)
我不喜欢我必须把字符串"OtherField"放在那里.它似乎很脆弱,容易错误排序或更改结构,然后我的查询失败,而我不知道它.
有没有办法得到字符串"OtherField"而不必声明const或类似的东西?我知道我可以使用反射来获取结构中的字段名称列表,但我真的很想做一些事情.
fieldName := nameOf(Test{}.OtherField)
collection.Find(bson.M{fieldName: someValue})
Run Code Online (Sandbox Code Playgroud)
Go有没有办法做到这一点?C#6有内置名称,但是通过反思挖掘我在Go中找不到任何方法.