Golang的一些小技巧

首先

    いろいろと気づいたことを順不同で雑多にまとめます。

总之

time.Unix は nanosec だけ渡せばよい
yaml と json のkey名指定を同じタグで指定する

for range で取り出した要素を変更する
意外と初期化しなくても使えるものたち

Content:

只需传递nanosec,time.Unix将兼容。

sec と nsec にわざわざ分割して渡してもいいが

now := time.Now()
unix := now.UnixNano()

sec := unix/1e9
nsec := (nsec - sec*1e9)

time.Unix(sec, nsec)

sec=0 にして nsec だけ渡せばOK

now := time.Now()
nano := now.UnixNano()
time.Unix(0, nano)

使用相同标签指定YAML和JSON中的键名。

对于解析 YAML,我们通常会使用 go-yaml/yaml。在这种情况下,需要分别使用 json 和 yaml 标签编写相应的标签。

type Person struct {
    FirstName string `json:"first_name" yaml:"first_name`
    LastName  string `json:"last_name" yaml:"last_name"`
}

如果使用ghodss/yaml来代替,就可以在json标记中实现共用。

type Person struct {
    FirstName string `json:"first_name"`
    LastName  string `json:"last_name"`
}

func main() {
    p := Person{
        FirstName: "Tarou",
        LastName: "Yamada",
    }

    bs, err := yaml.Unmarshal(&p)
    if err != nil {
        log.Panicf("error: %#v", err)
    }

    log.Printf("%s", bs)
    // first_name: Tarou
    // last_name: Yamada
}

修改用于范围的元素。

    当たり前っちゃ当たり前ですが、取り出した要素をそのまま更新しても変わりません
type Person struct {
    FirstName string
    LastName  string
}

persons := []Person{
    {FirstName: "Taro", LastName: "Yamada"},
    {FirstName: "Hanako", LastName: "Tanaka"},
    {FirstName: "Ichiro", LastName: "Suzuki"},
}

for _, p := range persons {
    p.LastName = "Takahashi"
}
fmt.Println(persons)
// [{Taro Yamada} {Hanako Tanaka} {Ichiro Suzuki}]
    変更したければ、 persons[i] を更新する
persons = persons0
for i := range persons {
    persons[i].LastName = "Takahashi"
}
fmt.Println(persons)
// [{Taro Takahashi} {Hanako Takahashi} {Ichiro Takahashi}]
    pointer配列の場合はそのまま変更ができる
ppersons := []*Person{
    {FirstName: "Taro", LastName: "Yamada"},
    {FirstName: "Hanako", LastName: "Tanaka"},
    {FirstName: "Ichiro", LastName: "Suzuki"},
}

for _, p := range ppersons {
    p.LastName = "Takahashi"
}
for _, p := range ppersons {
    fmt.Println(*p)
}
// {Taro Takahashi}
// {Hanako Takahashi}
// {Ichiro Takahashi}

一些东西即使不进行初始化也可以使用。

    • sync.Mutex

 

    • sync.WaitGroup

 

    • errgroup.Group

 

    スライス

※ 如果一个映射(map)是空的(nil),则在添加元素时会引发panic异常,但如果一个切片(slice)是空的(nil),则可以使用append函数添加元素。

var slice0 []int
fmt.Printf("%#v\n", slice0) // []int(nil)
slice0 = append(slice0, 0)
fmt.Printf("%#v\n", slice0) // []int{0}

slice1 := []int{}
fmt.Printf("%#v\n", slice1) // []int{}
slice1 = append(slice1, 0)
fmt.Printf("%#v\n", slice1) // []int{0}
广告
将在 10 秒后关闭
bannerAds