追加后修改Golang值

问题描述 投票:0回答:1

有人可以解释为什么我的结构体的值“Name”在附加到新切片后会发生变化吗?

package main

import (
    "fmt"
    "strings"

    "golang.org/x/text/language"
)

func main() {
    type Staff struct {
        Name     map[language.Tag]string
        Function string
    }
    var s = []Staff{
        Staff{
            Name:     map[language.Tag]string{language.Japanese: "Mike/Tom"},
            Function: "Cashier",
        },
    }
    checkedStaff := []Staff{}
    // check for multiple staff in one role
    for _, staff := range s {
        if !strings.Contains(staff.Name[language.Japanese], "/") {
            checkedStaff = append(checkedStaff, staff)
            continue
        }
        split := strings.Split(staff.Name[language.Japanese], "/")
        for _, staffNameNative := range split {
            staff.Name[language.Japanese] = strings.TrimSpace(staffNameNative)
            checkedStaff = append(checkedStaff, staff)
            fmt.Printf("%+v", checkedStaff)
        }
    }

}

我希望切片

checkedStaff
包含这些值:
[{Name:map[ja:Mike] Function:Cashier} {Name:map[ja:Tom] Function:Cashier}]

但它包含

[{Name:map[ja:Tom] Function:Cashier} {Name:map[ja:Tom] Function:Cashier}]

因此追加后,切片

checkedStaff
中的名称被修改。

参见Go Playground上的代码: https://go.dev/play/p/ovKO4Hc7N3t

go slice
1个回答
0
投票

您正在修改指向同一结构的指针。任何更改都会影响列表中的所有实例。

创建一个新实例来附加

package main

import (
    "fmt"
    "strings"

    "golang.org/x/text/language"
)

func main() {
    type Staff struct {
        Name     map[language.Tag]string
        Function string
    }
    var s = []Staff{
        Staff{
            Name:     map[language.Tag]string{language.Japanese: "Mike/Tom"},
            Function: "Cashier",
        },
    }
    checkedStaff := []Staff{}
    // check for multiple staff in one role
    for _, staff := range s {
        if !strings.Contains(staff.Name[language.Japanese], "/") {
            c := Staff{
                Name:     staff.Name,
                Function: staff.Function,
            }
            checkedStaff = append(checkedStaff, c)
            continue
        }
        split := strings.Split(staff.Name[language.Japanese], "/")
        for _, staffNameNative := range split {
            c := Staff{
                Name:     map[language.Tag]string{language.Japanese: strings.TrimSpace(staffNameNative)},
                Function: staff.Function,
            }
            checkedStaff = append(checkedStaff, c)
            fmt.Printf("%+v\n", checkedStaff)
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.