the code is like this(i make it simple,but the logic is not change)

const (   

    Ignore = "-"

    End    = "\r\n"

)


type AccessLog struct {    

    Hash                             string

    LowerIP                          string

    FlowType                         int8

    SendTime                         int64

    Host                             string

    AppName                          string

    StreamName                       string

    Protocol                         string

    StatusCode                       string

    Url                              string

    HttpAgent                        string

    Refer                            string

    VideoFrameRate                   int32

        .

        .

        .

        omit some variable

        .

        .

        .

}


func appendValue(rsp string, value string) string {

    if value == End {  // End

        rsp += value

    } else {

        rsp += (value + "|")

    }

    return rsp

}


func (a *AccessLog) SetStatusCode(statusCode string) {

    if a.StatusCode == "" {

        a.StatusCode = statusCode

    }

}


func (a *AccessLog) MakeString() string {

    var rsp string

    rsp = appendValue(rsp, Stop)

    rsp = appendValue(rsp, a.Hash) 

    rsp = appendValue(rsp, a.LowerIP) 

    rsp = appendValue(rsp, fmt.Sprint(a.FlowType))

    rsp = appendValue(rsp, fmt.Sprint(tt))

    rsp = appendValue(rsp, a.Host)

    rsp = appendValue(rsp, a.AppName) 

    rsp = appendValue(rsp, a.StreamName)

    rsp = appendValue(rsp, a.Protocol)

    rsp = appendValue(rsp, a.StatusCode) *//every time crash in this line,and 
panic: **runtime error: invalid memory address or nil pointer dereference*

    rsp = appendValue(rsp, a.Url) 

    rsp = appendValue(rsp, Ignore) 

    rsp = appendValue(rsp, Ignore)

        .

        .

        .

}


*2 goroutinue will access the same variable which is type of *AccessLog  ,like 
this*


func changeAccessLog(a *AccessLog){

   .

   .

   .

   a.SetStatusCode(code)

   .

   .

   .

}


func makeStringAccessLog(a *AccessLog) {

   .

   .

   .

   rsp := a.MakeString()

   .

   .

   .

}

*//this is the caller function*

func callFunc(){

   .

   .

   .

   a := new(AccessLog)

   go changeAccessLog(a)

   go makeStringAccessLog(a)

   .

   .

   .

}


so, i don't understand why operate string variable will case crash.

of course,the code in my program is more complex,function SetStatusCode and 
MakeString will be called in the same time.

do somebody meet this before???????




-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to