String I';我的索引超出了范围,引起了恐慌,我可以';我不能出去

String I';我的索引超出了范围,引起了恐慌,我可以';我不能出去,string,go,types,panic,String,Go,Types,Panic,我写这个程序是为了适应类型(而不是对象!) 基本前提是用户输入一个动物名称(牛、蛇鸟),然后输入一个动作(吃、移动、声音)。然后我的代码查找并返回值 因此,假设用户条目位于由“”分隔的一行上。我使用strings.Split 当用户只输入一个字符时,我收到一个“恐慌”通知。我认为这种恐慌源于编译器试图“拆分”单个字符 两个问题: 1.我说得对吗? 2.我怎么修理它 package main import ( "bufio" "fmt" "os" "strings

我写这个程序是为了适应类型(而不是对象!)

基本前提是用户输入一个动物名称(牛、蛇鸟),然后输入一个动作(吃、移动、声音)。然后我的代码查找并返回值

因此,假设用户条目位于由“”分隔的一行上。我使用strings.Split

当用户只输入一个字符时,我收到一个“恐慌”通知。我认为这种恐慌源于编译器试图“拆分”单个字符

两个问题: 1.我说得对吗? 2.我怎么修理它

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

//Create our type object.
type animal struct {
    aType, eats, moves, sounds string
}

//Create our methods.
func (animal animal) info (querie string) {
    if querie == "eats" {
        fmt.Printf("The animal, %s , eats %s\n ", animal.aType, animal.eats)
    } else if querie == "moves" {
        fmt.Printf("The animal, %s , moves by  %s\n ", animal.aType, animal.moves)
    } else {
        fmt.Printf("The animal, %s , makes the sound %s\n ", animal.aType, animal.sounds)
    }
}

func main() {
    //Now create our animals

    cow := animal{aType:"cow", eats: "grass", moves: "walking", sounds: "moo"}
    bird := animal{aType:"bird", eats: "worms", moves: "flying", sounds: "peep"}
    snake := animal{aType:"snake", eats: "mice", moves: "slithering", sounds: "hiss"}
    // need a boolean to perpetuate our loop
    var flag bool = true

    for flag {
        fmt.Println("Remember enter X to exit")
        fmt.Printf(">please enter your (format: type & information) request -> ")
        scanner := bufio.NewScanner(os.Stdin)
        scanner.Scan()
        request := scanner.Text()

        //Capture user entered data

        typed := strings.Split(request, " ")[0]
        if typed == "X" {
            flag = false
            break
        }
        infoe := strings.Split(request, " ")[1]

        // contruct the logic tree. 

        if !((infoe == "eat") || (infoe == "move") || (infoe == "speak")) {
            switch typed {
            case "cow": 
                cow.info(infoe)

            case "snake": 
                snake.info(infoe)

            case "bird": 
                bird.info(infoe)
            default: 
                fmt.Println("I don't know about that animal.")          
            }
        } else {
            fmt.Printf("I don't have that informtion")
                break
            }
        }
    }

在循环外部创建扫描仪,以避免丢弃缓冲数据。Scan()返回false时中断。检查并处理无效输入

scanner := bufio.NewScanner(os.Stdin)
for {
    fmt.Println("Remember enter X to exit")
    if !scanner.Scan() {
        break
    }
    request := scanner.Text()
    parts := strings.Split(request, " ")
    if parts[0] == "X" {
        break
    }
    if len(parts) < 2 {
        fmt.Println("bad input")
        break
    }

    typed := parts[0]
    infoe := parts[1]

    ...
scanner:=bufio.NewScanner(os.Stdin)
为了{
fmt.Println(“记住输入X以退出”)
if!scanner.Scan(){
打破
}
请求:=scanner.Text()
部分:=字符串。拆分(请求“”)
如果零件[0]=“X”{
打破
}
如果透镜(零件)<2{
fmt.Println(“错误输入”)
打破
}
已键入:=部分[0]
infoe:=零件[1]
...

为了简化代码,我建议使用
fmt.Scanf
,如下所示:

package main

import "fmt"

func main() {
    var animal, action string

    fmt.Printf("Enter animal: ")
    fmt.Scanf("%s", &animal)
    fmt.Printf("Enter action: ")
    fmt.Scanf("%s", &action)

    fmt.Printf("Animal was %s and action was %s", animal, action)
}
我也不知道为什么会有很多反对票。这是因为代码的编写方式有问题吗?我认为如果有人只是想学习这门语言,那没关系。首先让它工作起来,然后专注于其他事情


一旦你熟悉了这门语言,你就可以通过

中列出的要点了。太好了。我非常感激。什么恐慌?恐慌包括一个堆栈跟踪,可以准确地告诉你问题发生的地方。请将其包含在你的问题中。