Golang中如何合并两个for range循环?

Golang中如何合并两个for range循环?

能否合并两个for-range循环?

各位Gopher们好, 我接到一个任务,需要处理两个不同长度、包含相同和不同键值对的映射表,然后创建第三个映射表,其中包含两个映射表的共同元素以及各自独有的元素。需要注意以下几点:

  1. 不能修改原有的两个映射表,所有键值对必须插入到一个全新的映射表中
  2. 函数应该返回第一个、第二个和新的映射表

以下是我编写的代码:

package main

import "fmt"

func main() {
	fmt.Println("vim-go")

	numToWords := map[string]int{
		"oneHundred":   100,
		"twoHundred":   200,
		"threeHundred": 300,
		"fourHundred":  400,
		"sixHundred":   600,
	}

	sameNumToWords := map[string]int{
		"oneHundred":   100,
		"twoHundred":   200,
		"threeHundred": 300,
		"fiveHundred":  500,
	}

	map1, map2, mixMap := mixOfTwo(numToWords, sameNumToWords)
	fmt.Printf("first Map: %v\n", map1)
	fmt.Printf("second Map: %v\n", map2)
	fmt.Printf("mixOfTwo Map: %v\n", mixMap)

}

func mixOfTwo(first map[string]int, second map[string]int) (map[string]int,
	map[string]int, map[string]int) {
	mixOfTwoMaps := make(map[string]int)

	for firstKey, _ := range first {
		if _, ok := mixOfTwoMaps[firstKey]; ok == false {
			mixOfTwoMaps[firstKey] = first[firstKey]
		}
	}

	for secondKey, _ := range second {
		if _, ok := mixOfTwoMaps[secondKey]; ok == false {
			mixOfTwoMaps[secondKey] = second[secondKey]
		}
	}

	return first, second, mixOfTwoMaps

}

输出结果:

>go run main.go
vim-go
first Map: map[fourHundred:400 oneHundred:100 sixHundred:600 threeHundred:300 twoHundred:200]
second Map: map[fiveHundred:500 oneHundred:100 threeHundred:300 twoHundred:200]
mixOfTwo Map: map[fiveHundred:500 fourHundred:400 oneHundred:100 sixHundred:600 threeHundred:300 twoHundred:200]

虽然这段代码运行正常,但我想知道Go语言是否有办法可以同时遍历多个映射表。例如:

for key1, value1 ;key2, value2 := range map1;map2?

另外,如果存在更好、更高效的代码编写方式,请告诉我。


更多关于Golang中如何合并两个for range循环?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

不,你不能这样做。如果两个映射是相同类型,你可以合并它们,然后遍历合并后的映射。

更多关于Golang中如何合并两个for range循环?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 Acim,

感谢你的回答。是的,如果两个映射相同的话,这个方法肯定有效。但如果它们不相同,我在想是否可以用单个循环替代两个循环。

当然!!
我完全忽略了这一点,第一次时我不需要做任何检查,因为我是在向一个空映射添加元素!!

另外,我也不需要明确写出单独的键值名称,因为它们在 for 循环的作用域内。

感谢 Yamil 修正了我的逻辑错误以及语法错误。

总有一天我会因为我的愚蠢被踢出这个论坛的 😄😄😄

Golang 虽然有些冗长但运行速度很快。重写 mixOfTwo 函数

func mixOfTwo(first map[string]int, second map[string]int) (map[string]int, map[string]int, map[string]int) {
    mixOfTwoMaps := make(map[string]int)
	
for key, value := range first {
	mixOfTwoMaps[key] = value
}

for key, value := range second {
	if _, ok := mixOfTwoMaps[key]; !ok {
		mixOfTwoMaps[key] = value
	}
}

return first, second, mixOfTwoMaps
}

在Go语言中,没有直接合并多个for range循环的语法。不过可以通过其他方式优化代码,使其更简洁高效。以下是改进方案:

package main

import "fmt"

func main() {
    numToWords := map[string]int{
        "oneHundred":   100,
        "twoHundred":   200,
        "threeHundred": 300,
        "fourHundred":  400,
        "sixHundred":   600,
    }

    sameNumToWords := map[string]int{
        "oneHundred":   100,
        "twoHundred":   200,
        "threeHundred": 300,
        "fiveHundred":  500,
    }

    map1, map2, mixMap := mixOfTwo(numToWords, sameNumToWords)
    fmt.Printf("first Map: %v\n", map1)
    fmt.Printf("second Map: %v\n", map2)
    fmt.Printf("mixOfTwo Map: %v\n", mixMap)
}

func mixOfTwo(first map[string]int, second map[string]int) (map[string]int, map[string]int, map[string]int) {
    mixOfTwoMaps := make(map[string]int)
    
    // 遍历第一个map
    for key, value := range first {
        mixOfTwoMaps[key] = value
    }
    
    // 遍历第二个map
    for key, value := range second {
        mixOfTwoMaps[key] = value
    }
    
    return first, second, mixOfTwoMaps
}

更简洁的写法:

func mixOfTwo(first map[string]int, second map[string]int) (map[string]int, map[string]int, map[string]int) {
    mixOfTwoMaps := make(map[string]int)
    
    // 使用单个循环遍历两个map
    copyMap := func(source map[string]int) {
        for key, value := range source {
            mixOfTwoMaps[key] = value
        }
    }
    
    copyMap(first)
    copyMap(second)
    
    return first, second, mixOfTwoMaps
}

对于需要处理重复键的情况(保留后遍历的值):

func mixOfTwoWithOverride(first map[string]int, second map[string]int) (map[string]int, map[string]int, map[string]int) {
    mixOfTwoMaps := make(map[string]int)
    
    // 先遍历第一个map
    for key, value := range first {
        mixOfTwoMaps[key] = value
    }
    
    // 第二个map的值会覆盖第一个map中相同键的值
    for key, value := range second {
        mixOfTwoMaps[key] = value
    }
    
    return first, second, mixOfTwoMaps
}

这些实现都保持了原有映射表不变,创建了新的映射表,并且代码更加简洁高效。在Go中,直接遍历两个映射表是最直接和高效的方法。

回到顶部