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

4 回复

感谢,它按预期工作了。我确实检查了我的代码,唯一能看到的区别是使用了 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 用作 xxi 的索引,即使是像 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)
}
回到顶部