Go语言中如何使用枚举值作为索引操作多维数组或切片?
问题分析与解决方案
你的代码存在几个关键问题,导致编译错误和潜在运行时panic:
核心问题
- 类型定义错误:
MyType被定义为[][]string(二维string切片),但你却把produce声明为[][]MyType,这相当于创建了四维结构,完全不符合你用二维结构存储string的需求。 - 切片未正确初始化:
make([][]MyType, 0)创建了一个空的外层切片,直接访问produce[Red][Apple]会触发索引越界panic,因为外层切片没有任何元素。 - 类型不匹配:你试图将
string类型的值赋值给MyType类型的元素,两者类型完全不兼容,这就是编译错误的直接原因。
修正后的代码
以下是满足需求的正确实现,用Color和Fruit枚举作为二维切片的索引来存储string数据:
type ( Color int Fruit int ) const ( // 建议从0开始,符合Go切片索引的默认规则 Red Color = 0 Blue Color = 1 Apple Fruit = 0 BlueBerry Fruit = 1 ) func DoIt() { // 初始化二维切片:外层对应Color,长度为Color的枚举数量 produce := make([][]string, 2) // 初始化每个Color对应的内层Fruit切片 for i := range produce { produce[i] = make([]string, 2) } // 使用枚举值作为索引赋值(底层为int,可直接用作切片索引) produce[Red][Apple] = "Yummy Apple" produce[Blue][BlueBerry] = "Sweet Blueberry" }
额外说明
- 如果你坚持要让枚举值从1开始(比如
Red Color = 1),需要将切片长度设为最大枚举值+1,例如:produce := make([][]string, 3) // 因为最大Color是2,索引2需要长度3 for i := range produce { produce[i] = make([]string, 3) // 对应Fruit最大为2 } - 自定义枚举类型(
Color/Fruit)底层是int,可以直接用作切片索引,Go会自动进行隐式类型转换。
内容的提问来源于stack exchange,提问作者A Bit of Help
相关产品推荐
相关产品推荐

