我正在使用两个嵌套的接口(interface) slice 来提供记录分离。我将几个 dataItem 加载到接口(interface) slice ( var record []interface{} )
然后我将该接口(interface) slice 加载到另一个接口(interface) slice ( var db []interface{} )。
所以我应该有: db[0]record_org
那么我清除之前的记录片( var record []interface{} )
现在问题来了:我用新的数据项加载记录片。
现在不做任何其他事情,数据库中的第一个数据项发生了变化?
关于嵌套接口(interface)可以更改其父数据的接口(interface),我缺少什么???
我提供了这个问题的一个工作示例,这样全世界都会对我的愚蠢感到惊讶。
---------------------------- testDB.go ------------------- -------------
package main
import (
"fmt"
"time"
)
//
// Data Base Structures and Variables
//
var record []interface{}
var db []interface{}
func newWorkDataItem(exercise, date, side, notes, reps, weight string) (list map[string]string) {
wdList := make(map[string]string)
wdList["Exercise"] = exercise
wdList["Data"] = date
wdList["Side"] = side
wdList["Notes"] = notes
wdList["Reps"] = reps
wdList["Weight"] = weight
return wdList
}
//
// Main Function
//
func main() {
//
// Load Current Date
//
t := time.Now()
d := fmt.Sprintf("%d %d %d", t.Month(), t.Day(), t.Year())
//
// Create Database Records
//
record = append(record, newWorkDataItem("FWC", d, "Left", "---", "10", "12.5"))
record = append(record, newWorkDataItem("FWC", d, "Left", "---", "10", "12.5"))
db = append(db, record)
fmt.Println("Database1 = ", db)
record = record[:0]
fmt.Println("Record: ", record)
record = append(record, newWorkDataItem("FWT", d, "Left", "---", "10", "12.5"))
fmt.Println("Database2 = ", db)
}
---------------------- 显示结果 --------------
Database1 = [[map[数据:11 27 2019 练习:FWC 注释:--- 代表:10 侧:左侧重量:12.5] map [数据:11 27 2019 练习:FWC 注释:--- 代表:10 侧:左侧重量:12.5]]]
记录: []
数据库2 = [[ map [数据:11 27 2019 练习:FWT 注释:--- 代表:10 侧:左侧重量:12.5] map [数据:11 27 2019 练习:FWC 注释:--- 代表:10 侧:左侧重量:12.5]]]
最佳答案
slice 由三个值组成。指向数据缓冲区的指针、长度和容量。分配 slice 时,会复制三个值。
因此,当您将记录附加到 db
时第一次,它将指针复制到数据和 len。通过更改记录长度,您不会更改 db
中的副本长度.
这就是为什么您仍然在 db 中有两个值的原因。
您必须覆盖 db[0]
使用截断的记录,以便 db
有新的记录长度。
package main
import (
"fmt"
"time"
)
//
// Data Base Structures and Variables
//
var record []interface{}
var db []interface{}
func newWorkDataItem(exercise, date, side, notes, reps, weight string) (list map[string]string) {
wdList := make(map[string]string)
wdList["Exercise"] = exercise
wdList["Data"] = date
wdList["Side"] = side
wdList["Notes"] = notes
wdList["Reps"] = reps
wdList["Weight"] = weight
return wdList
}
//
// Main Function
//
func main() {
//
// Load Current Date
//
t := time.Now()
d := fmt.Sprintf("%d %d %d", t.Month(), t.Day(), t.Year())
//
// Create Database Records
//
record = append(record, newWorkDataItem("FWC", d, "Left", "---", "10", "12.5"))
record = append(record, newWorkDataItem("FWC", d, "Left", "---", "10", "12.5"))
db = append(db, record)
fmt.Println("Database1 = ", db)
record = record[:0]
fmt.Println("Record: ", record)
record = append(record, newWorkDataItem("FWT", d, "Left", "---", "10", "12.5"))
db[0] = record // <- override db[0] with new record slice
fmt.Println("Database2 = ", db)
}
输出预期结果
Database1 = [[map[Data:11 10 2009 Exercise:FWC Notes:--- Reps:10 Side:Left Weight:12.5] map[Data:11 10 2009 Exercise:FWC Notes:--- Reps:10 Side:Left Weight:12.5]]]
Record: []
Database2 = [[map[Data:11 10 2009 Exercise:FWT Notes:--- Reps:10 Side:Left Weight:12.5]]]
看到这个Go Playground示范。
关于go - 附加到 []interface{} 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59073795/