【发布时间】:2016-04-18 02:07:33
【问题描述】:
我有一个结构:
type user struct {
Id string
..
data_ptr *userData
}
并且我在全局范围内存储部分用户:
type Hall struct {
users []user
}
var hall = Hall{} //global
最后,http 处理程序:
func dataHandler(response http.ResponseWriter, request *http.Request) {
userExist, user_ptr := hall.haveUserId() //works fine
switch requestType {
case "load":
user_ptr.loadData() //data loaded and user_ptr.data_ptr is set
case "newData":
user_ptr.data_ptr = newData // <-- this is it, now previously set data_ptr == nil
那么,到底为什么,我的意思是我发送“加载”请求,它加载数据,将data_ptr 设置为user_ptr。但在下一次调用“newData”请求时,user_ptr.data_ptr 是 nil?
以防万一,这里是loadData():
func (p *user) loadData(userId) {
..
data := userData {}
p.data_ptr = &data
}
编辑:user_ptr 的来源:
func (h *Hall) haveUserId(id string) (bool, *user) {
for _, u := range h.users {
if u.Id == id {
fmt.Println("UID found")
return true, &u
}
}
return false, nil
}
【问题讨论】:
-
很可能是因为您操作的是 copy 而不是 slice 元素。你如何创建
user_ptr? -
能否请
gofmt显示您的实际代码,即user_ptr的来源? -
@icza 已更新,请参阅问题末尾的编辑
-
@user3591723,用相关文章更新问题
-
@DensiTensy 你没有添加足够的相关信息,仍然没有
gofmt。只需显示您的整个dataHandler函数,因为它实际上是在您的代码中编写的。这不可能;到处都会有编译错误。