Golang中如何确保字符串数组中相同索引的字符串长度一致

Golang中如何确保字符串数组中相同索引的字符串长度一致 我有三个数组,其中一个为空或者与其他两个数组的索引长度不一致。我希望通过追加空字符串,使其索引长度与其他两个数组相同,即达到长度2。

package main

import "fmt"

func main() {
	arr1 := []string{"apple", "banana", "cherry"}
	arr2 := []string{"dog", "cat", "hamster"}
	arr3 := []string{}
	for _, arr := range [][]string{arr1, arr2, arr3} {
		if len(arr) < 1 {
			//fmt.Print(arr)
			for i := len(arr); i <= 2; i++ {
				arr = append(arr, "")
			}
		}
	}
	fmt.Print(arr1, arr2, arr3)

}

当我运行这段代码时,最后一个数组仍然是空的,索引长度为0。

Go Playground

Go Playground - The Go Programming Language


更多关于Golang中如何确保字符串数组中相同索引的字符串长度一致的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

大家好,

使用 for i := 0; i < len(array); i++ 这种语法。它非常好,以至于大多数编程语言都支持它。for range 循环应该只在需要时才使用。

你提供的两种解决方案都很接近,但并非我完全认同的做法。简单地使用索引 i 进行迭代,并将元素追加到 arr[i] 即可。

更多关于Golang中如何确保字符串数组中相同索引的字符串长度一致的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我在你的代码下方添加了一些注释来说明问题。

package main

import "fmt"

func main() {
	arr1 := []string{"apple", "banana", "cherry"}
	arr2 := []string{"dog", "cat", "hamster"}
	arr3 := []string{}
	for _, arr /* this is a copy of one of arr1, arr2, arr3 */ := range [][]string{arr1, arr2, arr3 /* these are the slices by value */} {
		if len(arr) < 1 {
			//fmt.Print(arr)
			for i := len(arr); i <= 2; i++ {
				// you're appending and updating the local variable, arr, but not
				// reassigning back to arr1, arr2, arr3, etc.
				arr = append(arr, "")
			}
		}
	}
	fmt.Print(arr1, arr2, arr3)

}

一个解决方案是使用指向切片的指针,这样你就能更新原始切片:Go Playground - The Go Programming Language

或者,你可以将值复制回去:Go Playground - The Go Programming Language

在循环中直接对arr进行append操作不会修改原始数组,因为arr是切片副本。你需要通过索引修改原始数组。以下是修正后的代码:

package main

import "fmt"

func main() {
	arr1 := []string{"apple", "banana", "cherry"}
	arr2 := []string{"dog", "cat", "hamster"}
	arr3 := []string{}
	
	// 获取最大长度
	maxLen := 0
	for _, arr := range [][]string{arr1, arr2, arr3} {
		if len(arr) > maxLen {
			maxLen = len(arr)
		}
	}
	
	// 确保所有数组长度一致
	arrays := [][]string{arr1, arr2, arr3}
	for i := range arrays {
		for len(arrays[i]) < maxLen {
			arrays[i] = append(arrays[i], "")
		}
	}
	
	// 重新赋值给原始变量
	arr1, arr2, arr3 = arrays[0], arrays[1], arrays[2]
	
	fmt.Println(arr1, arr2, arr3)
	// 输出: [apple banana cherry] [dog cat hamster] [  ]
}

或者使用更简洁的方式:

package main

import "fmt"

func normalizeArrays(arrays ...[]string) [][]string {
	// 找到最大长度
	maxLen := 0
	for _, arr := range arrays {
		if len(arr) > maxLen {
			maxLen = len(arr)
		}
	}
	
	// 扩展所有数组到相同长度
	result := make([][]string, len(arrays))
	for i, arr := range arrays {
		result[i] = make([]string, maxLen)
		copy(result[i], arr)
		for j := len(arr); j < maxLen; j++ {
			result[i][j] = ""
		}
	}
	
	return result
}

func main() {
	arr1 := []string{"apple", "banana", "cherry"}
	arr2 := []string{"dog", "cat", "hamster"}
	arr3 := []string{}
	
	normalized := normalizeArrays(arr1, arr2, arr3)
	arr1, arr2, arr3 = normalized[0], normalized[1], normalized[2]
	
	fmt.Println(arr1, arr2, arr3)
}

关键点:

  1. 在循环中修改切片副本不会影响原始切片
  2. 需要先确定目标长度(最大数组长度)
  3. 通过索引直接操作原始数组或返回新的数组
回到顶部