如何通过Scanner输入创建Go语言结构体的多个新实例?
解决Go语言循环创建结构体实例不被覆盖的问题
要解决实例被重复覆盖的问题,核心是用切片存储每次创建的新实例,而非复用单个变量。同时修复原代码中的错误,以下是修改后的完整代码:
package main import ( "bufio" "fmt" "os" "strings" ) type Boat struct { name string color string design string } type Car struct { name string color string design string } func main() { // 用切片存储多个实例,替代单个变量 var boats []Boat var cars []Car scanner := bufio.NewScanner(os.Stdin) fmt.Println("输入格式:类型 名称 颜色 样式(输入exit退出)") for { if scanner.Scan() { userIn := scanner.Text() // 添加退出命令 if userIn == "exit" { break } scanMain := strings.Fields(userIn) // 校验输入长度,避免索引越界 if len(scanMain) != 4 { fmt.Println("输入格式错误!请按「类型 名称 颜色 样式」格式输入") continue } scanType := scanMain[0] name := scanMain[1] color := scanMain[2] design := scanMain[3] switch scanType { case "car": // 创建新Car实例并添加到切片 newCar := Car{name: name, color: color, design: design} cars = append(cars, newCar) fmt.Printf("已创建Car实例:%+v\n", newCar) case "boat": // 创建新Boat实例并添加到切片 newBoat := Boat{name: name, color: color, design: design} boats = append(boats, newBoat) fmt.Printf("已创建Boat实例:%+v\n", newBoat) default: fmt.Println("无效类型!请输入car或boat") } } // 处理扫描输入的错误 if err := scanner.Err(); err != nil { fmt.Printf("读取输入出错:%v\n", err) break } } // 退出时展示所有已创建的实例 fmt.Println("\n所有已创建的Car实例:") for idx, car := range cars { fmt.Printf("%d: %+v\n", idx+1, car) } fmt.Println("\n所有已创建的Boat实例:") for idx, boat := range boats { fmt.Printf("%d: %+v\n", idx+1, boat) } }
关键修改说明
- 切片存储实例:用
[]Boat和[]Car替代单个变量,通过append持续添加新实例,避免覆盖 - 修复赋值错误:原代码中Boat的三个字段均赋值给
name,现已修正为对应字段赋值 - 输入校验:检查输入字段数量,防止索引越界;添加
exit命令支持正常退出循环 - 创建新实例:每次匹配类型时直接初始化新结构体,而非修改旧实例
- 错误处理与反馈:处理Scanner读取错误,创建实例后打印确认信息,退出时汇总所有实例
内容的提问来源于stack exchange,提问作者CodeDragon
相关产品推荐
相关产品推荐

