Do you call B and C with any arguments? 

if you have call B and C with req, you can use the method: req.WithContext 
as below:

func A(w http.ResponseWriter, req *http.Request) {
  ctx := Context.WithValue(req.Context(), "log", log)
  req := req.WithContext(ctx)
  B(req)
  C(req)
}


func B(req) {
 * log := req.Value("log"*
*  log.Info("im in func B!")*
  // ...
}

On Wednesday, February 15, 2012 at 4:32:45 PM UTC+8, 韩拓 wrote:
>
> hi list,
> my problem is, i have a typical http server,like:
> func A(w http.ResponseWriter, req *http.Request) {
>   B()
>   C()
> }
>
> func B() {
>   // ...
> }
> func C() {
>   // ...
> }
>
> now i want to log something (per request),like:
> func A(w http.ResponseWriter, req *http.Request) {
>   *log := NewLog()*
>   *log.Info("call B")*
>   B()
>  * log.Info("call C")*
>   C()
>   *if (apiDebug) { ResponseLog(w, log) }*
> }
>
> func B() {
>   // ...
> }
> func C() {
>   // ...
> }
>
> the problem is i can`t log in func B or func C,unless modify their 
> signature :
> func B(log Log) or func B(cxt Context)
> but there are lots of codes,nearly all my functions need modify.
>
> so, if i can get the current goroutine`s id or its local storage(if 
> have),i can do this:
>
> func A(w http.ResponseWriter, req *http.Request) {
>   *SetContext(xxx) // or SetContext(xxx, myGoroutineId)*
>   B()
>   C()
>   *ClearContext(myGoroutineId)*
> }
>
> func B() {
>  * log := GetContext() // or GetContext(myGoroutineId)*
> *  log.Info("im in func B!")*
>   // ...
> }
> func C() {
>   // ...
> }
>
> could i do this in golang?
>
> thanks.
>
> --
>     此致,
> 敬礼!
>
>                      韩拓
>

-- 
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