所以我看着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)
}
答案 0 :(得分:2)
Go是一种garbage collected语言。指针指向的结构只要有对它的引用就是有效的。多个连接与此无关,因为每次调用record
时都会创建一个新的LogAccess
,如果您按照相关代码进行操作,则会看到该引用至少存在于writeAccessLog
的结尾,可能更长,具体取决于glog.Infoln
的实施情况。
要清楚&someType { ... fields ...}
创建一个新的(未命名的)someType
实例,然后返回该实例的地址。