我有一个结构:
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
}
这是因为您对 副本 进行操作,而不是对slice元素本身进行操作。
在haveUserId()
函数中for ... range
,make循环遍历的元素的副本,然后返回此副本的地址。因此,稍后您将修改此副本,该副本与切片中的值无关。因此,如果稍后您检查slice元素中的地址,则该地址仍将保持不变(nil
)。
可能的解决方法:返回slice元素的地址: &h.users[i]
func (h *Hall) haveUserId(id string) (bool, *user) {
for i := range h.users {
if h.users[i].Id == id {
fmt.Println("UID found")
return true, &h.users[i]
}
}
return false, nil
}
为了说明这一点,请参见以下示例:
type Point struct{ x, y int }
ps := []Point{{1, 2}, {3, 4}}
fmt.Println(ps) // Output: [{1 2} {3 4}]
for _, v := range ps {
v.x += 10 // Modifies just the copy
}
fmt.Println(ps) // Output (unchanged): [{1 2} {3 4}]
for i := range ps {
ps[i].x += 10 // Modifies value in slice
}
fmt.Println(ps) // Output (changed): [{11 2} {13 4}]
在Go Playground上尝试一下。
我想知道何时或是否必须删除此对象。下面是一个基本类对象Object.cpp的构造函数: 我知道在分配内存时,你应该在某个时候删除它,但是我在构造函数中分配了内存,并且想再次使用变量1和2,我什么时候删除它们?
我有一个func添加两个NO并返回(a+B)。然后我创建了一个指向func的func指针。希望为该函数指针的数组分配内存并访问它们。代码如下。 我的问题是使用malloc的下面一行: 编译时,sizeof(add_2nos*)和sizeof(add_2nos)没有任何区别。如果有什么区别??另外,如果类型转换是必要的,而我正在分配相同类型的内存…?
主要内容:到底使用字符数组还是字符串常量C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《 C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下: 运行结果: https://www.xnip.cn https://www.xnip.cn 字符数组归根结底还是一个数组,上节讲到的关于 指针和数组的规则同样也适用于字符数组。更改上面的代码,使用指针的方式来输出字符串: 运行结果: https://ww
我解决了一个黑客等级的问题。 编辑 感谢@John的回答。下面是没有seg故障的情况:
问题内容: 给定一个看起来像 如果要设置为1,则必须 有没有办法在一行中执行此操作而不必给我新值它自己的名字(在这种情况下)? 问题答案: 如邮件列表中所述,您可以执行以下操作: 然后 如果您必须经常这样做。内联(请参见输出),因此它应该几乎没有性能损失。
在用C进行编码练习时,我必须为指向结构()的指针分配内存,即使该结构可能已经预先为它分配了内存,否则我将得到“赋值到空指针”类型的错误。 我的假设是,如果指针要指向一个预先分配内存的结构,那么分配更多的内存将是冗余的?为了澄清,代码编译和运行都没有错误,只是搞不清楚为什么我需要分配内存来实现预期的行为。 这里有一个链接到一个要点,以了解完整的上下文。谢了!