Go 语言入门三部曲(二):能用 Go 语言写管理系统

简介:

@[toc]

草草写了个 ATM,颇有收获。数据层我就不写了,毕竟最后一个暑假了,我也想去歇歇。

目录结构

没什么需求分析,管理系统写来写去也就那些功能还能玩出花儿来么哈哈。

在这里插入图片描述

main.go

每个项目里总要有个 main 入口嘛。

package main

import (
    run "go/run"
    ui "go/ui"
)

func main() {
    run.Run()
    ui.Hello_ui()
}

ui.go

所有界面都在里面了。麻雀虽小,还是跟业务层解耦了。

package ui

import (
    "fmt"
    run "go/run"
    "os"
)

var user_id int

func Hello_ui() {
    var flag int

    fmt.Println("\t\t\t欢迎来到 ATM 系统  \t\t\t")
    fmt.Println("\t\t\t\t\t1、登录 2、注册")

    fmt.Scan(&flag)

    choose(flag)
}

func choose(flag int) {
    if flag == 1 {
        login()
    } else if flag == 2 {
        reg()
    } else {
        fmt.Println("请重新选择")
        fmt.Scan(&flag)
        choose(flag)
    }
}

func get_msg(s []int) int {

    handle := run.Get_handle(s[0])
    role := handle(s)
    return role
}

func login() {
    var pwd int
    fmt.Println("请输入账号:")
    fmt.Scan(&user_id)
    fmt.Println("请输入密码:")
    fmt.Scan(&pwd)

    var s = []int{1, user_id, pwd}
    role := get_msg(s)
    if 2 == role {
        fmt.Println("登录失败,请重新登录···")
        login()
    } else {
        for {
            menu(role)
        }
    }
}

func reg() {
    var pwd int
    fmt.Println("请输入密码:")
    fmt.Scan(&pwd)

    var s = []int{2, 123456}
    id := get_msg(s)

    fmt.Println("生成账号为:", id)
    fmt.Println("现在切换回登录界面")
    login()
}

func menu(role int) {
    var choose int
    fmt.Println("\t\t\t 菜单选择 \t\t\t")

    if 0 == role {
        //普通用户菜单
        fmt.Println("\t\t\t 1、新增管理员 \t\t\t")
        fmt.Println("\t\t\t 2、查看用户量 \t\t\t")
        fmt.Println("\t\t\t 3、查询流水账 \t\t\t")
        fmt.Println("\t\t\t 4、用户  销户 \t\t\t")
        fmt.Println("\t\t\t 其他、退出系统 \t\t\t")
        fmt.Scan(&choose)
        switch choose {
        case 1:
            add_master()
        case 2:
            search_user_num()
        case 3:
            search_log()
        case 4:
            del_user()
        default:
            os.Exit(1)
        }
    } else {
        //管理员菜单
        fmt.Println("\t\t\t 1、查询余额 \t\t\t")
        fmt.Println("\t\t\t 2、存款 \t\t\t")
        fmt.Println("\t\t\t 3、取款 \t\t\t")
        fmt.Println("\t\t\t 4、转账 \t\t\t")
        fmt.Println("\t\t\t 5、查询交易记录 \t\t\t")
        fmt.Println("\t\t\t 其他、退出系统 \t\t\t")
        fmt.Scan(&choose)
        switch choose {
        case 1:
            search_money()
        case 2:
            in_money()
        case 3:
            out_money()
        case 4:
            move_money()
        case 5:
            search_user_log()
        default:
            os.Exit(1)
        }
    }
}

func add_master() {
    fmt.Println("跟注册没啥两样,不实现了")
}

func search_user_num() {
    user_num := get_msg([]int{3})
    fmt.Println("用户数量为:%d", user_num)
}

//这两个查账的业务比较特殊,一会儿单独做
func search_log() {
    handle := run.Get_handle2(1)
    s := handle(user_id)

    //开始批量输出
    fmt.Println("管理员查询流水账,", s[0])
}

func del_user() {
    var id int
    fmt.Println("请输入将要注销的用户 id:")
    fmt.Scan(&id)

    id = get_msg([]int{4, id})
    if 0 == id {
        fmt.Println("销户失败")
    } else {
        fmt.Println("销户  成功", id)
    }
}

func search_money() {
    money := get_msg([]int{5, user_id})

    fmt.Println("用户账户余额为:", money)
}

func in_money() {
    var in int
    fmt.Println("请输入存款金额:")
    fmt.Scan(&in)

    money := get_msg([]int{6, user_id, in})

    if -1 == money {
        fmt.Println("存款失败,请联系银行管理员")
    } else {
        fmt.Println("用户账户余额为:", money)
    }
}

func out_money() {
    var out int
    fmt.Println("请输入取款金额:")
    fmt.Scan(&out)

    money := get_msg([]int{6, user_id, out})

    if -1 == money {
        fmt.Println("取款失败,请联系银行管理员")
    } else {
        fmt.Println("用户账户余额为:", money)
    }
}

func move_money() {
    var move, to_id int
    fmt.Println("请输入对方账号:")
    fmt.Scan(&to_id)
    fmt.Println("请输入转账金额:")
    fmt.Scan(&move)

    money := get_msg([]int{6, user_id, to_id, move})

    if -1 == money {
        fmt.Println("转账失败,请联系银行管理员")
    } else {
        fmt.Println("用户账户余额为:", money)
    }
}

// 这个也比较特殊,稍后处理
func search_user_log() {
    handle := run.Get_handle2(2)
    s := handle(user_id)

    //开始批量输出
    fmt.Println("用户查询交易记录,", s[0])
}

worker.go

业务层面,“命令 + 门面” 这套手法是越来越熟了哈。

这里面本该连接数据层的地方我全用注释了。

package worker

type fn func([]int) int
type fn2 func(int) []int

var handle_Map = make(map[int]fn)
var handle_Map2 = make(map[int]fn2)

func login(s []int) int {

    //校验账号密码
    if s[1] == 123456 && s[2] == 123456 {
        return 0
        //超级用户 返回0;普通用户,返回1,登录失败,返回2
    } else {
        return 2
    }
}

func reg(s []int) int {

    //获取 id
    var id = s[1]

    return id
}

func search_user_num(s []int) int {
    //获取用户数量
    return 0
}

func del_user(s []int) int {
    //销户
    return s[1]
}

func search_money(s []int) int {
    //查询余额
    return 0
}

func in_money(s []int) int {
    //用户存款
    return 0
}

func out_money(s []int) int {
    //用户取款
    return 0
}

func move_money(s []int) int {
    //用户转账
    return 0
}

func search_log(s int) []int {
    //查询所有信息
    return []int{}
}

func search_user_log(s int) []int {
    //查询用户账本
    return []int{}
}

func Run() {
    handle_Map[1] = login
    handle_Map[2] = reg
    handle_Map[3] = search_user_num
    handle_Map[4] = del_user
    handle_Map[5] = search_money
    handle_Map[6] = in_money
    handle_Map[7] = out_money
    handle_Map[8] = move_money

    handle_Map2[1] = search_log
    handle_Map2[2] = search_user_log

}

func Get_handle(flag int) fn {
    return handle_Map[flag]
}

func Get_handle2(flag int) fn2 {
    return handle_Map2[flag]
}

相关文章
|
30天前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
1月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
2月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
2月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
166 0
|
7月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
7月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
3月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
3月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
3月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
4月前
|
分布式计算 Go C++
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
99 10