Go中Map与Struct联合使用注意点

在Go中,如果map联合struct使用需要注意。

下面程序编译出错,因为 a[1].x =3无法编译通过,信息为:cannot assign to a[1].x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
"fmt"
)

func main() {
type Test struct {
x int
y int
}

a := make(map[int]Test)

a[1] = Test{x: 1, y: 1}

a[2] = Test{x: 2, y: 2}

a[1].x = 3

fmt.Println(a[1], a[2])

}

如果map类型改为slice类型,则程序没有问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func main() {
type Test struct {
x int
y int
}

a := make([]Test,3)

a[1] = Test{x: 1, y: 1}

a[2] = Test{x: 2, y: 2}

a[1].x = 3

fmt.Println(a[1], a[2])

}

如果还要使用map类型,同时保持类似处理流程,则需要使用*struct,具体程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

func main() {
type Test struct {
x int
y int
}

a := make(map[int]*Test)

a[1] = &Test{x: 1, y: 1}

a[2] = &Test{x: 2, y: 2}

a[1].x = 3

fmt.Println(*a[1], *a[2])

}