有人可以解释为什么我的结构体的值“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
您正在修改指向同一结构的指针。任何更改都会影响列表中的所有实例。
创建一个新实例来附加
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)
}
}
}