在使用golang变成的过程中,struct的使用频率非常高,基础的使用我们都会,但有的时候可能会接到一些特殊的需求,或者发现别人的代码读起来不那么顺畅。那是因为struct的一些“冷门”方式,我们不那么熟练。
接下来,就跟大家分享下,我最近用到的“生僻方法”:
结构体中的json是干什么用的?
定义一个结构体
type Tina struct{
appID string`json:"string"`
}
这里的这个json可不是备注的意思,而是在使用http接口进行传输时,根据json标识的内容对结构体做解析。
在做项目的时候就发生一个case:
{
actionIDint`json:"actionType"`
actionTypestring`json:"actionID"`
}
报错:
actionID为string类型,无法解析int类型的变量。但是结构体中定义的类型确实是int,后来仔细检查,发现是actionID和actionType的json写反了
拉平结构体:
有的时候,我们需要引用另一个结构体,但是我们希望字段在同一层次结构。
比如在开发项目的时候,proto中定义了log是可以直接插入到mongoDB中的,但是需要加一个 _id 来保证mongo的主键和 log_id一致
如果使用简单的字段提升方式:
typeCaseLog struct{
Id string `bson:"_id,omitempty"`
siber.CaseLog
}
这样虽然使得结构体能够直接访问到相应字段,但是录入到mongo中还是有层级嵌套的。
typeCaseLog struct{
Id string `bson:"_id,omitempty"`
CaseLog siber.CaseLog `bson:",inline"`
}
这种方式就可以完美的解决问题,既可以方便的赋值,又保持了结构体只有一个层级。
匿名结构体:
package main
import (
"fmt"
)
func main() {
emp3 := struct {
firstName, lastName string
age, salary int
}{
firstName: "Andreah",
lastName: "Nikola",
age: 31,
salary: 5000,
}
fmt.Println("Employee 3", emp3)
}
这种方式很适合仅使用一次的结构体定义。
结构体的匿名字段:
package main
import (
"fmt"
)
type Person struct {
string
int
}
func main() {
p := Person{"Naveen", 50}
fmt.Println(p)
}
虽然匿名字段没有名称,但其实匿名字段的名称就默认为它的类型。
网友评论