go - 附加到 []interface{} 问题

标签 go

我正在使用两个嵌套的接口(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/

相关文章:

go - 使用适用于 Go 的 AWS 开发工具包使用完整 URI 从 S3 下载文件

go - 以编程方式检查 SPF、DKIM、DMARC

mongodb - 如何使 $not regexp 查询在 Go 中工作?

go - 将图像编码为基本64位编码的字节格式

go - 如何在 go 中获取私有(private) reflect.Value 的内容?

installation - 安装 Go 语言

go - 如何不舍入持续时间

go - channel 缓冲区比 Go 中的预期多取一个值

json - 戈朗 : Unmarshal JSON Object results in empty map

go - 在 Web 应用程序中运行计划任务