Can someone explain why my struct’s value “Name” is altered after it was appended to a new slice?
<code>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)
}
}
}
</code>
<code>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)
}
}
}
</code>
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)
}
}
}
I would expect the slice checkedStaff
to contain these values:
[{Name:map[ja:Mike] Function:Cashier} {Name:map[ja:Tom] Function:Cashier}]
but instead it contains
[{Name:map[ja:Tom] Function:Cashier} {Name:map[ja:Tom] Function:Cashier}]
so after the append the name in the slice checkedStaff
is modified.
See the code on Go Playground:
https://go.dev/play/p/ovKO4Hc7N3t