Golang:你如何在尚未初始化的结构上使用指针

时间:2015-05-24 19:23:18

标签: go

所以我看着file here

他们打电话给record := &accessLog,但是他们不会先将它初始化为变量,如果他们这样做,如果有多个同时连接就有可能记录会被其他人写下来&# 39; s数据?

type accessLog struct {
ip, method, uri, protocol, host     string
elapsedTime                         time.Duration
}

func LogAccess(w http.ResponseWriter, req *http.Request, duration time.Duration) {
clientIP := req.RemoteAddr

if colon := strings.LastIndex(clientIP, ":"); colon != -1 {
    clientIP = clientIP[:colon]
}

record := &accessLog{
    ip:             clientIP,
    method:         req.Method,
    uri:            req.RequestURI,
    protocol:       req.Proto,
    host:           req.Host,
    elapsedTime:    duration,
}

writeAccessLog(record)
}

1 个答案:

答案 0 :(得分:2)

Go是一种garbage collected语言。指针指向的结构只要有对它的引用就是有效的。多个连接与此无关,因为每次调用record时都会创建一个新的LogAccess,如果您按照相关代码进行操作,则会看到该引用至少存在于writeAccessLog的结尾,可能更长,具体取决于glog.Infoln的实施情况。

要清楚&someType { ... fields ...}创建一个新的(未命名的)someType实例,然后返回该实例的地址。