package main
import "fmt"
type Person struct {
Name string
Sex int
}
func main() {
u := make(map[string]Person) // 定义一个map ,值为上面Person的结构体
person := Person{"乔峰", 0}
u["p"] = person
u["p"].Sex = 18 // 按道理上面u["p"] 已经赋值成了person即Person{"乔峰", 0}的结构体,使用结构体.key=value应该没毛病
fmt.Println(u["p"])
}
输出:
./main.go:17:2: cannot assign to struct field u["p"].Sex in map
package main
import "fmt"
type Person struct {
Name string
Sex int
}
func main() {
u := make(map[string]*Person) // 注意这里的变化:定义一个map ,值为上面Person的结构体指针
person := Person{"乔峰", 0}
u["p"] = &person
u["p"].Sex = 18
fmt.Println(u["p"])
}
package main
import "fmt"
type Person struct {
Name string
Sex int
}
func main() {
u := make(map[string]*Person) // 注意这里的变化:定义一个map ,值为上面Person的结构体指针
//定义Person数组
persons := []Person{
{Name: "乔峰", Sex: 18},
{Name: "鸠摩智", Sex: 23},
{Name: "慕容复", Sex: 22},
}
//将数组依次添加到map中
for _, person := range persons {
u[person.Name] = &person
}
//打印map
for k, v := range u {
fmt.Println(k, "=>", v.Name)
}
}
遍历结果出现非预期的结果。仔细看,结果是错误的:
乔峰 => 慕容复
鸠摩智 => 慕容复
慕容复 => 慕容复
我们发现map中的3个key都指向数组中最后一个结构体。
分析
for循环中,person是结构体的一个拷贝副本,所以u
[person.Name]=&person
实际上一直都是指向了同一个指针, 最终该指针的值为遍历的最后一个struct的值拷贝。
怎么改?
package main
import "fmt"
type Person struct {
Name string
Sex int
}
func main() {
u := make(map[string]*Person)
//定义Person数组
persons := []Person{
{Name: "乔峰", Sex: 18},
{Name: "鸠摩智", Sex: 23},
{Name: "慕容复", Sex: 22},
}
// 遍历结构体数组,依次赋值给map
for i := 0; i < len(persons); i++ {
u[persons[i].Name] = &persons[i]
}
//打印map
for k, v := range u {
fmt.Println(k, "=>", v.Name)
}
}
package main
import "fmt"
type Person struct {
Name string
Sex int
}
func main() {
u := make(map[string]Person) // 定义一个map ,值为上面Person的结构体
person := Person{"乔峰", 0}
u["p"] = person
u["p"].Sex = 18 // 按道理上面u["p"] 已经赋值成了person即Person{"乔峰", 0}的结构体,使用结构体.key=value应该没毛病
fmt.Println(u["p"])
}
输出:
./main.go:17:2: cannot assign to struct field u["p"].Sex in map
package main
import "fmt"
type Person struct {
Name string
Sex int
}
func main() {
u := make(map[string]*Person) // 注意这里的变化:定义一个map ,值为上面Person的结构体指针
person := Person{"乔峰", 0}
u["p"] = &person
u["p"].Sex = 18
fmt.Println(u["p"])
}
package main
import "fmt"
type Person struct {
Name string
Sex int
}
func main() {
u := make(map[string]*Person) // 注意这里的变化:定义一个map ,值为上面Person的结构体指针
//定义Person数组
persons := []Person{
{Name: "乔峰", Sex: 18},
{Name: "鸠摩智", Sex: 23},
{Name: "慕容复", Sex: 22},
}
//将数组依次添加到map中
for _, person := range persons {
u[person.Name] = &person
}
//打印map
for k, v := range u {
fmt.Println(k, "=>", v.Name)
}
}
遍历结果出现非预期的结果。仔细看,结果是错误的:
乔峰 => 慕容复
鸠摩智 => 慕容复
慕容复 => 慕容复
我们发现map中的3个key都指向数组中最后一个结构体。
分析
for循环中,person是结构体的一个拷贝副本,所以u
[person.Name]=&person
实际上一直都是指向了同一个指针, 最终该指针的值为遍历的最后一个struct的值拷贝。
怎么改?
package main
import "fmt"
type Person struct {
Name string
Sex int
}
func main() {
u := make(map[string]*Person)
//定义Person数组
persons := []Person{
{Name: "乔峰", Sex: 18},
{Name: "鸠摩智", Sex: 23},
{Name: "慕容复", Sex: 22},
}
// 遍历结构体数组,依次赋值给map
for i := 0; i < len(persons); i++ {
u[persons[i].Name] = &persons[i]
}
//打印map
for k, v := range u {
fmt.Println(k, "=>", v.Name)
}
}