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日

悬赏问题

  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛