1 回答

TA貢獻(xiàn)1725條經(jīng)驗 獲得超8個贊
簡短版本:切片中的所有元素都是 的淺拷貝res,因此該CreateAt字段指向相同的值。
詳情:
附加res到時icr,添加到的元素icr是 的副本res。
這適用于該領(lǐng)域Num,可以在res不影響存儲的數(shù)據(jù)的情況下對其進(jìn)行修改icr。這是因為它是基本類型。
但是,CreateAt字段res 是指針,所以副本仍然是同一個指針。的所有元素都icr將CreateAt指向相同的值。對該值的任何修改都將反映在 的所有元素中icr。
你有兩個選擇(至少):
更改CreateAt為 plain time.Time,這意味著它將被復(fù)制而不僅僅是一個指針
第二次使用不同的變量解組。例如:json.Unmarshal(newBytes.Bytes(), &res2)
這是一個沒有 json 或 slice 的更清晰的示例,只有兩個變量,其中一個是另一個的副本:見在 playground 上:
package main
import (
"bytes"
"encoding/json"
"fmt"
"time"
)
type test struct {
Num int `json:"num"`
CreateAt *time.Time `json:"create_at"`
}
func main() {
now := time.Now()
res := test{1, &now}
res2 := res
fmt.Println(PrettyPrint(res), PrettyPrint(res2))
// Modify res2:
res2.Num = 2
*res2.CreateAt = time.Now().Add(time.Hour)
fmt.Println(PrettyPrint(res), PrettyPrint(res2))
}
// PrettyPrint ...
func PrettyPrint(data interface{}) string {
var out bytes.Buffer
b, _ := json.Marshal(data)
json.Indent(&out, b, "", " ")
return out.String()
}
輸出:
{
"num": 1,
"create_at": "2009-11-10T23:00:00Z"
} {
"num": 1,
"create_at": "2009-11-10T23:00:00Z"
}
{
"num": 1,
"create_at": "2009-11-11T00:00:00Z"
} {
"num": 2,
"create_at": "2009-11-11T00:00:00Z"
}
更新res2時,res2.Num不會影響res.Num,因為它是基本類型。但是,res2.CreateAt兩者res.CreateAt都指向同一個對象,因此更改會反映在兩者中。
- 1 回答
- 0 關(guān)注
- 128 瀏覽
添加回答
舉報