You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:30:59