美文网首页
golang struct 的奇技淫巧

golang struct 的奇技淫巧

作者: 梦之上 | 来源:发表于2019-10-17 19:53 被阅读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)
    }
    

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

    相关文章

      网友评论

          本文标题:golang struct 的奇技淫巧

          本文链接:https://www.haomeiwen.com/subject/mmnvmctx.html