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}