为了账号安全,请及时绑定邮箱和手机立即绑定

我的索引超出范围,我开始恐慌,我无法脱身

我的索引超出范围,我开始恐慌,我无法脱身

Go
月关宝盒 2022-06-06 16:06:12
我正在编写这个程序来适应类型(而不是对象!)。基本前提是用户输入一个动物名称(牛、蛇鸟),然后输入一个动作(吃、移动、声音)。然后我的代码查找它并返回值。因此,假设用户条目位于由“”分隔的一行。我使用strings.Split。当用户只输入一个字符时,我会收到“恐慌”通知。我认为这种恐慌源于编译器试图“拆分”单个字符。两个问题: 1. 我说的对吗?2. 我该如何解决?package mainimport (    "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)
查看完整描述

2 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

在循环外创建扫描仪以避免丢弃缓冲数据。当 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]


    ...


查看完整回答
反对 回复 2022-06-06
?
MYYA

TA贡献1868条经验 获得超4个赞

为了简化您的代码,我建议使用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)

}

也不确定为什么会有多个反对票。是代码编写方式的问题吗?如果有人只是想学习语言,我认为没关系。首先让它工作,然后专注于其他事情。


查看完整回答
反对 回复 2022-06-06
  • 2 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信