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

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

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

我想要达到的结果

正常运行

实际上是编译相关的问题。编译过程实际上就是编译了从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所以也能正常使用
如果有问题欢迎追问哦,如果有帮助欢迎采纳。

只能有一个main包,你写了两个是独立的,你将定义函数的命名另外的包进行导入使用

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632