在HTTP handler中引用全局变量,为何有的可以,有的却报告引用地址错误?

http.Handle("/", handler)

在 handler 的 ServeHTTP 方法中引用全局变量,有的成功了,有的却报告引用地址错误?

请问为什么呢?

共 14 个回复


fising

@jimmykuu

# 0

jimmykuu

可用的代码?报错的代码?

# 1

fising

type DefaultHTTPHandler struct {
    config *conf.ConfigFile
}

func (hh *DefaultHTTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Println(global_config) //nil
    fmt.Println(hh.config) //成功
    fmt.Println(listen_port) //8080
# 2

fising

@jimmykuu

# 3

fising

接3楼:

第6行引用全局变量失败,nil 第8行引用全局变量,成功 目前按照第7行的方案读取的,成功

# 4

jimmykuu

global_config在哪定义的?

另外hh.config也不是全局变量。

# 5

fising

package main

import (
    "flag"
    "fmt"
    "github.com/hgfischer/goconf"
    "net/http"
    "os"
    "strconv"
    "strings"
)

var (
    debug_mode    bool
    listen_port   int
    global_config *conf.ConfigFile
)
# 6

fising

global_config 是全局变量

# 7

jimmykuu

在哪初始化的呢?

# 8

fising

hh.config 的确不是全局变量,写在这里,是想说现在是这样读取到的。

# 9

fising

在 main 函数中初始化的: global_config, err := conf.ReadConfigFile(config_file)

# 10

fising

对不起,刚来这个论坛没多久,所以格式标记还不太熟悉。

hh := new(DefaultHTTPHandler)
hh.config = global_config
http.Handle("/", hh)

目前在main中,使用了第2行的代码进行传递的

# 11

jimmykuu

global_config, err := conf.ReadConfigFile(config_file)得到的global_config是一个局部变量,你的全局变量其实是没有赋值的。正确的做法是这样:

var err error
global_config, err = conf.ReadConfigFile(config_file)

:=操作符会创建新的局部变量,使用时要注意。

# 12

fising

原来如此,非常感谢!以后就来这里了~

# 13