golang struct 的奇技淫巧

2019-10-17  本文已影响0人  梦之上

在使用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)
}

虽然匿名字段没有名称,但其实匿名字段的名称就默认为它的类型。

上一篇下一篇

猜你喜欢

热点阅读