Golang中如何动态初始化Map的键
Golang中如何动态初始化Map的键 你好,
我想知道是否可以使用循环动态地初始化Map中的键。 假设我有以下代码:
package main
import "fmt"
func main() {
xi := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
x := []string{"r", "a", "j", "s", "i", "n", "g", "h", "s"}
var m map[string]int
i := 0
for i = range xi {
// m[i] = x[i]
}
fmt.Println(m)
}
我的需求是使用字符串数组作为map的键,整数数组作为对应的值。请告诉我我的理解是否正确,以及这是否可行。
谢谢
更多关于Golang中如何动态初始化Map的键的实战教程也可以访问 https://www.itying.com/category-94-b0.html
感谢,它按预期工作了。我确实检查了我的代码,唯一能看到的区别是使用了 make。
您分享的代码:m = make(map[string]int)
我分享的代码:var m map[string]int
我也找到了相关的解释。
更多关于Golang中如何动态初始化Map的键的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
变量 m 是一个键为字符串类型、值为整数类型的映射:
var m map[string]int
映射类型是引用类型,类似于指针或切片,因此上面 m 的值是 nil;它并未指向一个已初始化的映射。在读取时,nil 映射的行为类似于空映射,但尝试向 nil 映射写入数据将导致运行时恐慌;请勿这样做。要初始化映射,请使用内置的 make 函数:
m = make(map[string]int)
是的,这是可行的,不过你需要将索引 i 用作 x 和 xi 的索引,即使是像 m[x[i]] 这样的嵌套索引也是如此。
此外,你需要先使用 make 创建这个映射。
最终代码如下(我缩短了输入内容,因为我在手机上操作,而且在这里复制时处理引号很麻烦):
package main
import "fmt"
func main() {
x := []string{"a", "b"}
xi := []int{1, 2}
m := make(map[string]int)
for i := range x {
m[x[i]] = xi[i]
}
fmt.Println(m)
}
在Go语言中,你可以使用循环动态初始化Map的键。你的理解是正确的,但需要先初始化Map,然后通过循环赋值。以下是修正后的代码示例:
package main
import "fmt"
func main() {
xi := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
x := []string{"r", "a", "j", "s", "i", "n", "g", "h", "s"}
// 初始化Map
m := make(map[string]int)
// 确保两个切片长度相同
if len(xi) == len(x) {
for i := 0; i < len(x); i++ {
m[x[i]] = xi[i] // 使用字符串作为键,整数作为值
}
}
fmt.Println(m)
}
输出结果:
map[a:2 g:7 h:8 i:5 j:3 n:6 r:1 s:4 s:9]
注意:由于字符串切片中有重复的"s",最后一个值会覆盖前一个。如果需要处理重复键,可以这样修改:
package main
import "fmt"
func main() {
xi := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
x := []string{"r", "a", "j", "s", "i", "n", "g", "h", "s"}
m := make(map[string]int)
for i, key := range x {
if i < len(xi) {
m[key] = xi[i]
}
}
fmt.Println(m)
}
使用range循环的简化版本:
package main
import "fmt"
func main() {
xi := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
x := []string{"r", "a", "j", "s", "i", "n", "g", "h", "s"}
m := make(map[string]int)
for i, key := range x {
m[key] = xi[i]
}
fmt.Println(m)
}

