Zack Wen 2022-02-17 23:14 采纳率: 100%
浏览 52
已结题

go语言分别放两个package就报错,但是放到一起就没有问题,请问怎么解决

问题遇到的现象和发生背景

我面向对象编写了一个分成两个package的简易学生系统,在main包里声明了结构体,在其他包里面定义的结构体,Goland没有报错,但是实际编译就会报错。

问题相关代码,请勿粘贴截图

main.go↓

package main

import (
"fmt"
"os"
)

//Student 结构体
var smr StudentMr

func showMenu() {
fmt.Println("欢迎来到学生管理系统!")
fmt.Println(请输入以下功能选项 1.查看全部学生 2.新增学生 3.删除学生 4.修改学生 5.退出 )
}

func main() {
var choice int
smr = StudentMr{
StuList: make(map[string]Student, 60),
}
//打印菜单
for {
showMenu()
fmt.Println("请输入你的选项:")
fmt.Scanln(&choice)
fmt.Printf("你选择的是%d", choice)
fmt.Println()
switch choice {
case 1:
smr.showAllStudent()
case 2:
smr.addStudent()
case 3:
smr.deleteStudent()
case 4:
smr.updateStudent()
case 5:
os.Exit(1)
default:
fmt.Println("你啥也没选择")
}
}

}

Student_Mng.go↓

package main

import "fmt"

type Student struct {
id string
name string
}
type StudentMr struct {
StuList map[string]Student
}

func (s StudentMr) showAllStudent() {
for _, v := range s.StuList {
fmt.Println(v.id, v.name)
}

}

func (s StudentMr) addStudent() {
var name string
var id string

fmt.Println("请输入学生ID")
fmt.Scanln(&id)
fmt.Println("请输入学生姓名")
fmt.Scanln(&name)
stu := Student{
    id:   id,
    name: name,
}
s.StuList[stu.id] = stu
fmt.Printf("你添加的的学生和ID:%#v", stu)
fmt.Println()

}
func (s StudentMr) deleteStudent() {
var id string
fmt.Println("请输入要删除的学生ID")
fmt.Scanln(&id)
_, ok := s.StuList[id]
if !ok {
fmt.Println("不存在ID为:", id, "的学生")
} else {
delete(s.StuList, id)
}

}

func (s StudentMr) updateStudent() {
var id string
fmt.Println("请输入要更新的学生ID")
fmt.Scanln(&id)
_, ok := s.StuList[id]
if !ok {
fmt.Println("不存在ID为:", id, "的学生")
} else {
var name string
fmt.Println("请输入更新的学生姓名")
fmt.Scanln(&name)
upStu := Student{
id: id,
name: name,
}
s.StuList[id] = upStu
}

}

运行结果及报错内容

command-line-arguments

.\main.go:9:9: undefined: StudentMr
.\main.go:24:8: undefined: StudentMr

Compilation finished with exit code 2

img

我的解答思路和尝试过的方法

我尝试过把方法名改成大写,但是依然报这个错

我想要达到的结果

正常运行

  • 写回答

3条回答 默认 最新

  • ProblemTerminator Go领域优质创作者 2022-03-09 13:43
    关注

    实际上是编译相关的问题。编译过程实际上就是编译了从main函数开始的流程代码,在main函数所在文件的同级目录下进行编译或运行即可。
    方法1:包名都使用同一个时,以下几种编译方式都可:
    go build .
    go build main.go Student_Mng.go↓
    go build main.go Student_Mng.go↓
    或直接运行:go run main.go Student_Mng.go↓

    方法2:定义不同的包:要调用的放在不同的包下即可,编译main时因为使用了import所以也能正常使用
    如果有问题欢迎追问哦,如果有帮助欢迎采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月13日
  • 已采纳回答 4月5日
  • 创建了问题 2月17日

悬赏问题

  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗