golang socket地址问题

golang socket TCP连接 定义了一个全局map

var conns map[string]net.Conn

保存Accept的net.Conn

conns[conn.RemoteAddr().String()] = conn
log.Println("conns", conns)
for k, v := range conns {
    log.Println(k, v)
}

问题是:log的conns数组和range conns的结果不一样?求解释。

clipboard.png

阅读 3.5k
2 个回答

仔细看后面的&

试试

conns[conn.RemoteAddr().String()] = conn
log.Println("conns", conns)
for k, v := range conns {
    log.Println(k, *v)
}
    conns[conn.RemoteAddr().String()] = conn
    log.Println("conns", conns) // fmt.Sprintln判断map conns的v的类型是接口,不进行递归打印

    log.Printf("%p\n", conn.(*net.TCPConn))
    log.Printf("%+v\n", conn.(*net.TCPConn))

    for k, v := range conns {
        log.Println(k, v) // 在这里fmt.Sprintln判断v的底层类型是Struct,而进行了递归打印
    }

再具体的话可以追踪代码看看,主要代码在fmt package的func (p *pp) printValue(value reflect.Value, verb rune, depth int)函数里.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题