• golang实战--家庭收支记账软件(面向对象)


    首先是具体的目录结构:

    其中myAccount.go中调用utils包中的函数;utils.go实现记账软件的一些相应的功能;

    myAccount.go

    package main
    
    import (
        "fmt"
        "go_code/project_5/utils"
    )
    
    func main() {
        fmt.Println("这个是面向对象的方法完成的")
        utils.NewFamilyAccount().MainMenu()
    
    }

    utils.go

    package utils
    
    import "fmt"
    
    type familyAccount struct {
        //声明一些常用的字段
        //申明一个字段,保存输入的选择
        key string
        //申明一个字段判断是否退出循环
        loop bool
        //定义账户的余额
        balance float64
        //每次收支的金额
        money float64
        //每次收支的说明
        note string
        //收支的详情,使用字符串来记录
        details string
        //定义一个字段记录是否有收支行为
        flag bool
    }
    
    func NewFamilyAccount() *familyAccount {
        return &familyAccount{
            key:     "",
            loop:    false,
            balance: 10000.0,
            money:   0.0,
            note:    "",
            flag:    false,
            details: "
      收入 	金额		  明细		说明",
        }
    }
    
    //给结构体定义相应的方法
    //显示菜单
    func (f *familyAccount) MainMenu() {
        for {
            fmt.Println("----------------------家庭收支软件-----------------------")
            fmt.Println("                      1.收支明细")
            fmt.Println("                      2.登记收入")
            fmt.Println("                      3.登记支出")
            fmt.Println("                      4.退出软件")
            print("请选择(1-4):")
            fmt.Scanln(&f.key)
            switch f.key {
            case "1":
                f.ShowDetails()
            case "2":
                f.Income()
            case "3":
                f.Outcome()
            case "4":
                f.Logout()
            default:
                fmt.Println("请输入正确的选项")
            }
    
            if f.loop {
                break
            }
        }
    }
    
    func (f *familyAccount) ShowDetails() {
        if f.flag {
            fmt.Println("----------------------当前收支明细-----------------------")
            fmt.Println(f.details)
        } else {
            fmt.Println("当前没有收支明细,来一笔吧")
        }
    }
    
    func (f *familyAccount) Income() {
        fmt.Println("本次收入金额:")
        fmt.Scanln(&f.money)
        f.balance += f.money
        fmt.Println("本次收入说明:")
        fmt.Scanln(&f.note)
        f.details += fmt.Sprintf("
      收入 	%v		  %v		%v", f.balance, f.money, f.note)
        f.flag = true
    }
    
    func (f *familyAccount) Outcome() {
        fmt.Println("本次支出金额:")
        fmt.Scanln(&f.money)
        if f.money > f.balance {
            fmt.Println("余额不足!!!")
            //break
        } else {
            f.balance -= f.money
            fmt.Println("本次收入说明:")
            fmt.Scanln(&f.note)
            f.details += fmt.Sprintf("
      支出 	%v		  %v		%v", f.balance, f.money, f.note)
            f.flag = true
        }
    }
    
    func (f *familyAccount) Logout() {
        fmt.Println("你确定要退出吗?y/n")
        choice := ""
        for {
            fmt.Scanln(&choice)
            if choice == "y" || choice == "n" {
                break
            }
            fmt.Println("您的输入有误!!请重新输入!")
        }
        if choice == "y" {
            f.loop = true
        }
    }

    对上一节面向过程的收支软件的改进。

    首先要将一些相干的变量存储到结构体中,然后用一个工厂方法进行初始化,最后将相应的功能封装成方法;

  • 相关阅读:
    linux下php调试工具xdebug安装配置
    linux下php开发环境搭建(nginx+php+mysql)
    centos7使用docker部署gitlab-ce-zh应用
    CentOS7上Docker安装与卸载
    struts2 中 paramsPrepareParamsStack 拦截器
    ModelDriven & Preparable 接口
    OLW Test
    sqlserver 错误:2,错误40
    C#时间截
    http post发送
  • 原文地址:https://www.cnblogs.com/xiximayou/p/11928793.html
Copyright © 2020-2023  润新知