【发布时间】:2020-01-06 02:04:43
【问题描述】:
我想动态填充我的内部结构,用于原子插入。我是新手,所以指针和引用它们是我仍在学习的东西。我不明白为什么每个循环都将相同的字段放入两次。我尝试删除'&'然后我得到一个不能使用类型作为*类型的错误,我检查以确保我的循环击中了tradeArray中的每个对象,并且确实如此。看起来它正在用它循环的最后一个对象覆盖它之前的对象。我该如何解决这个问题?
func createTrade(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
var tradeArray []Trade
if err := json.NewDecoder(r.Body).Decode(&tradeArray); err != nil {
e := Error{Message: "Bad Request - Improper Types Passed"}
w.WriteHeader(http.StatusBadRequest)
_ = json.NewEncoder(w).Encode(e)
return
}
for _, trade := range tradeArray {
internal := InternalTrade{
Id: strconv.Itoa(rand.Intn(1000000)),
Trade: &trade,
}
submit := TradeSubmitted{
TradeId: internal.Id,
ClientTradeId: trade.ClientTradeId ,
}
submitArray = append(submitArray, submit)
trades = append(trades, internal)
}
if err := json.NewEncoder(w).Encode(submitArray); err != nil {
e := Error{Message:"Internal Server Error"}
w.WriteHeader(http.StatusInternalServerError)
_ = json.NewEncoder(w).Encode(e)
return
}
}
编辑:我能够通过创建一个新变量来保存交易并在结构创建中引用该变量来解决我的问题。如果有人能解释一下,我将不胜感激,我不确定这与我上面提到的“交易”有何不同。
for _, trade := range tradeArray {
p := trade
internal := InternalTrade{
Id: strconv.Itoa(rand.Intn(1000000)),
Trade: &p,
}
submit := TradeSubmitted{
TradeId: internal.Id,
ClientTradeId: trade.ClientTradeId ,
}
submitArray = append(submitArray, submit)
trades = append(trades, internal)
}
【问题讨论】:
-
程序中有一个变量
trade,该变量的地址不变。在第二个 sn-p 中,循环的每次迭代都会创建一个新变量p。每个新变量都有一个唯一的地址。
标签: go