Golang中运行Slices时遇到问题如何解决

Golang中运行Slices时遇到问题如何解决 大家好,我目前是Go语言的新手!

我刚刚注意到第51行有一个错误,这非常奇怪。 有人愿意帮助我吗?谢谢!

以下是我的程序链接

Go Playground - The Go Programming Language

Go是一种开源编程语言,可以轻松构建简单、可靠且高效的软件。

8 回复

是的,你说得对,我之前没看到那个错误——我滚动得不够远。@NobbZ 已经回答了关于索引的问题。

更多关于Golang中运行Slices时遇到问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


christophberger:

var names strings.Fields(booking)

嗨,

感谢回复。我已经尝试更改它,但我没有看到任何变化,构建仍然不可用?

这会不会是一个错误?

谢谢

@christophberger

关于切片似乎还存在另一个运行时错误的问题。

会不会是因为切片的范围是0?

谢谢

Go Playground - The Go Programming Language

Go 是一种开源编程语言,它使得构建简单、可靠且高效的软件变得容易。

你好 @zaidzac95

这是第 51 行:

var names strings.Fields(booking)

var names X 是一个变量声明,其中 X 必须是一个类型标识符。

要一步创建变量并为其赋值,请使用 := 符号:

names := strings.Fields(booking)

这是以下代码的简写形式:

var names X
names = strings.Fields(booking)

你通过 var 声明了 bookings,因此它成为一个取决于类型的零值,在本例中为 nil。一个值为 nil 的切片在所有意图和目的上都表现得像一个空切片。

你从未向这个切片添加任何元素,因此尝试访问索引 0(即“第一个元素”)显然会失败。

在尝试打印第一个元素之前,你应该先向其追加你想要包含的数据。

抱歉,是我的错。我在手机上回答了问题,但没有运行修复后的代码。

所以当我修复并运行代码时,我得到了这个错误。

./prog.go:52:27: cannot use booking (type []string) as type string in argument to strings.Fields

这很清楚:booking 是一个字符串切片,但 Fields() 期望一个单独的字符串。我猜这一行中的 "booking" 应该是 "bookings"

这个版本的代码运行没有错误。

编辑: 当然它还是有错误,我没有往下滚动得足够远。抱歉,今天状态不佳。

正如 @NobbZ 提到的,问题在于你试图引用数组中尚不存在的某个位置,因此在引用该值之前对数组进行赋值,将能解决这个错误。

这里 是一个应该能成功运行的代码版本。

请注意,该程序在 Playground 中仍然无法运行,因为在第 53 行,你引用了数组中的位置 0(值得一提的是,即使在一次成功的运行中,数组也不总是包含超过 0 个元素,例如在用户只是按下了回车键而没有输入任何长度的字符串的情况下,所以你可能也需要考虑这一点)。由于 Go Playground 不接受程序所期望的标准输入方式,这个值始终为空。

标准输入、标准输出和标准错误是 naclFile 的实例,它使用系统调用来与实际文件交互(这些是 Playground 程序与外界交互的唯一方式),

摘自:Inside the Go Playground - The Go Programming Language

根据你提供的代码链接,我分析了程序中的问题。主要问题在第51行,这是一个切片越界错误。

问题分析

在你的代码中,numbers 切片有5个元素(索引0-4),但在第51行的循环中,你试图访问 numbers[i+1],当 i=4 时就会访问 numbers[5],这超出了切片范围。

解决方案

这里有几种修复方法:

方法1:调整循环条件(推荐)

for i := 0; i < len(numbers)-1; i++ {
    fmt.Printf("当前数字: %d, 下一个数字: %d\n", numbers[i], numbers[i+1])
}

方法2:完整修复代码

package main

import "fmt"

func main() {
    numbers := []int{10, 20, 30, 40, 50}
    
    fmt.Println("原始切片:", numbers)
    
    // 安全地遍历切片,避免越界
    for i := 0; i < len(numbers)-1; i++ {
        fmt.Printf("索引 %d: 当前值=%d, 下一个值=%d\n", 
            i, numbers[i], numbers[i+1])
    }
    
    // 或者使用 range 遍历
    fmt.Println("\n使用 range 遍历:")
    for i, num := range numbers {
        fmt.Printf("索引 %d: 值=%d\n", i, num)
    }
}

方法3:如果你想比较相邻元素

package main

import "fmt"

func main() {
    numbers := []int{10, 20, 30, 40, 50}
    
    // 比较相邻元素
    for i := 1; i < len(numbers); i++ {
        diff := numbers[i] - numbers[i-1]
        fmt.Printf("numbers[%d]-numbers[%d] = %d - %d = %d\n", 
            i, i-1, numbers[i], numbers[i-1], diff)
    }
}

关键点

  1. 切片索引从0开始:长度为n的切片,有效索引是0到n-1
  2. 边界检查:访问切片元素前要确保索引在有效范围内
  3. 使用len()函数len(slice) 返回切片当前长度
  4. range关键字:使用 for i, v := range slice 可以安全遍历所有元素

你的代码只需要将第51行的循环条件从 i < len(numbers) 改为 i < len(numbers)-1 即可解决越界问题。

回到顶部