Go中遇到的几个小问题

简单记录下写go时遇到的一些问题

struct做为map的值

如果map的值为struct的话, 是无法直接通过m[key].member来直接读取对应结构体的变量的, 同时我们也无法直接取它的地址&m[key]. 为什么会这样呢

网上有挺多关于这个的讨论:

这个特性与golang处理map有关: 随着键值的增长, map会重新分配内存. 一个解决方法是将值付给一个变量, 修改它, 然后再赋值回去;)

信号处理

go处理信号的方式是以channel方式, 信号处理函数直接接收channel即可. 下面是一个接收SIGUSR1信号的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import (
    "os/signal"
    "syscall"
    ...
)

func main() {
    ....

    sq := make(chan os.Signal, 1)
    signal.Notify(sq, syscall.SIGUSR1)

    ....
    for true {
        select {
        case <-sq:
            gReopenLog = true
        default:
            /* empty */
        }
        ....
    }
}

函数recevier

很多时候会碰到结构体指针作为函数的recevier, 但有时候也会碰到结构体直接作为recevier的, 两者有什么差别呢.

推荐阅读一下这篇文章, 写的不错.

Last

最后分享一个2012年的一个slide: Rob Pike讲并发与并行, 看完之后会对go有更深的了解.

go

Comments