golang struct 的奇技淫巧

aside section ._1OhGeD · · 3577 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:aside section ._1OhGeD

查看原文:golang struct 的奇技淫巧

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3577 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传