Golang中如何填充数组切片的值

Golang中如何填充数组切片的值 大家好下午好,你们好吗?希望一切都好! 我从事可观测性工作(Zabbix、Grafana、Prometheus),并且天生就是个bash脚本爱好者,哈哈。 我学习GoLang大约有一周了,我想理解为什么这个不工作 Go Playground - The Go Programming Language

基本上我的想法是做一个for循环,来填充数组的元素。

8 回复

感谢你的建议,Yamil_Bracho。

更多关于Golang中如何填充数组切片的值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好,欢迎。 为什么 Playground 对你不起作用?你能发布一下你试图运行的代码吗?另外,请用英语发布你的消息,这样你可能会获得更多帮助…

问候

看起来它正在工作……它将所有字符串存储在一个只有一个元素的切片中……

Go Playground - The Go Programming Language

Go语言的工作方式可能与你期望的不同。它无法直接将字符串“012345678910”转换为由独立元素组成的切片。为此,你需要在循环前创建切片,并在每次迭代中追加字符串。或者,你是想通过索引获取字符串中的元素吗?

package main

import "fmt"

func main() {
	var dilan string

	for x := 0; x <= 10; x++ {
		if x != 10 {
			dilan += fmt.Sprintf("%v,", x)
		} else {
			dilan += fmt.Sprintf("%v", x)
		}
	}

	slice := []string{dilan}
	fmt.Println(slice[0])
}

我可能表达有误。我的意图是用 dilan 的内容来填充切片数组,使其变成 slice := []string{dilan},而当展开时,它应该是 slice := []string{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},但这失败了,因为我只能访问元素 0。换句话说,尝试索引这些值没有成功。

确实,我正在学习编程,而使用Bash的习惯根深蒂固。那种想把东西拼凑起来的冲动很强烈,但我已经设法改进,并以最好的方式实现了我“想要”的效果。感谢所有以各种方式提供帮助的人。

我想实现这样的效果:

image

package main

import "fmt"

func main() {
    // 方法1: 使用索引直接赋值
    var arr1 [5]int
    for i := 0; i < len(arr1); i++ {
        arr1[i] = i * 2
    }
    fmt.Println("数组:", arr1) // [0 2 4 6 8]

    // 方法2: 使用append填充切片
    var slice1 []int
    for i := 0; i < 5; i++ {
        slice1 = append(slice1, i*3)
    }
    fmt.Println("切片:", slice1) // [0 3 6 9 12]

    // 方法3: 预分配切片容量后填充
    slice2 := make([]int, 5)
    for i := 0; i < len(slice2); i++ {
        slice2[i] = i * 4
    }
    fmt.Println("预分配切片:", slice2) // [0 4 8 12 16]

    // 方法4: 使用range遍历填充
    slice3 := make([]int, 5)
    for i := range slice3 {
        slice3[i] = i * 5
    }
    fmt.Println("range填充:", slice3) // [0 5 10 15 20]
}

你提供的playground链接中的代码问题在于数组声明方式。在Go中,数组长度是类型的一部分,不能使用变量作为数组长度(除非是常量)。以下是修正版本:

package main

import "fmt"

func main() {
    // 正确做法1: 使用切片而不是数组
    size := 5
    slice := make([]int, size)
    
    for i := 0; i < size; i++ {
        slice[i] = i + 1
    }
    fmt.Println(slice) // [1 2 3 4 5]

    // 正确做法2: 使用数组字面量
    var arr [5]int
    for i := 0; i < 5; i++ {
        arr[i] = i + 1
    }
    fmt.Println(arr) // [1 2 3 4 5]
}

关键区别:

  • 数组:长度固定,声明时长度必须是常量
  • 切片:动态长度,可以使用变量初始化

在可观测性场景中,切片更常用,因为通常需要处理可变数量的指标数据。

回到顶部