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]
}

相关文章
|
1月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
215 4
|
2月前
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
|
1月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
381 43
Go语言深度解析:从入门到精通的完整指南
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
152 1
|
2月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
3月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
359 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
232 0
【Go语言入门100题】026 I Love GPLT (5 分) Go语言 | Golang
L1-026 I Love GPLT (5 分) Go语言|Golang 这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。 所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
704 0
|
存储 Go
【Go语言入门100题】023 输出GPLT (20 分) Go语言 | Golang
L1-023 输出GPLT (20 分) Go语言|Golang 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。 下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
223 0
|
3月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
286 1
下一篇
oss云网关配置