一、准备工作
需求分析
1)用户注册
2)用户登录
3)显示在线用户列表
4)群聊(广播)
5)点对点聊天
6)离线留言
主界面
首先,在项目根目录下初始化mod,然后按照如下结构设计目录:
海量用户通信系统/
├── go.mod
├── client/
│ ├── main.go
│ └── login.go
└── server/
二、main
package main
import (
"fmt"
)
// 定义两个变量,一个表示用户id,一个表示用户密码
var userID int
var pwd string
func main() {
//接收用户的选择
var key int
//判断是否还继续显示菜单
var loop = true
for loop {
fmt.Println("------------------欢迎登录多人聊天系统")
fmt.Println("\t\t\t 1 登录聊天室")
fmt.Println("\t\t\t 2 注册用户")
fmt.Println("\t\t\t 3 退出系统")
fmt.Println("\t\t\t 请选择(1-3):")
fmt.Scanln(&key)
switch key {
case 1:
fmt.Println("登录聊天室")
loop = false
case 2:
fmt.Println("注册用户")
loop = false
case 3:
fmt.Println("退出系统")
loop = false
default:
fmt.Println("你的输入有误,请重新输入")
}
}
//根据用户输入显示新的提示信息
if key == 1 {
//说明用户要登录
fmt.Printf("请输入用户的id号:")
fmt.Scanf("%d\n", &userID)
fmt.Printf("请输入用户的密码:")
fmt.Scanf("%s\n", &pwd)
//先把登录的函数,写到另外一个文件
err := login(userID, pwd)
if err != nil {
fmt.Println("登录失败!")
} else {
fmt.Println("登录成功!")
}
} else if key == 2 {
fmt.Println("进行用户注册的逻辑...")
}
}
特别注意:scanf
中要加上换行符,否则其余scanf会接收换行符,如果用scanln
,换行符处理更麻烦,所以推荐用scanf且加上\n的形式。
三、login
package main
import (
"fmt"
)
func login(userId int, pwd string) error {
//下一个就要开始定协议
fmt.Printf("userId=%d pwd=%s\n", userId, pwd)
return nil
}
四、测试login
特别注意:login和main是同包,所以login的函数名开头无需大写,main无需导包即可使用,但如果不导包,编译器是不会编译调用函数所在文件的!所以运行main前必须先编译login,也可以在client下用“go run .”(注意有一个点)来编译运行当前目录下所有文件。如果你用的是vscode+code runner,且仍想通过运行按钮来执行main,那么你需要打开settings,打开settings.json,找到"code-runner.executorMap"
中的go选项,将原来的值“go run”
改为“go run ./client”
,运行server目录的情况同理。
运行结果如下:
1 登录聊天室
1 登录聊天室
2 注册用户
3 退出系统
请选择(1-3) :
1
登录聊天室
请输入用户的id号:111
请输入用户的密码:111
userId=111 pwd=111
登录成功!