AI时代下应该如何去学习编程语言

        AI编程工具的性能提升令人印象深刻!如今再去努力记忆编程语法知识已经没有了意义!我们只需要去大概的了解一下语法知识,再结合AI便可以运用到企业级的项目中去!这意味着学习编程的方式正在发生根本性改变。

AI时代编程学习的新策略

编程语言上的改变

从语法记忆转向概念理解,从代码编写转向代码审查,从独立编程转向人机协作

程序员的核心

算法和数据结构,系统设计能力,问题分解能力

AI时代下的学习思想

项目驱动学习(从实际项目开始,边做边学,使用AI工具辅助,但要理解每行代码的含义,关注项目的整体架构和设计思路

AI辅助学习(让AI解释代码逻辑,帮助理解复杂概,让AI快速生成代码框架

码审查技能(识别AI生成代码的问题,掌握代码重构和优化技巧,培养对代码质量的敏感度

go语言语法(了解,去项目中学习)

百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/1w7AEaoadlleYLtlTyKdutQ?pwd=2369

项目驱动学习

AI代码生成

我这里用的AI是Claude(下一篇文章会教如何去注册使用Claude)!说好的超详解!!!(每天token限制,可以去用国内的通义千问,通义灵码)

大家可以看到我让AI给我生成了一个个人记账系统!!

项目代码如下:

package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"
)

// 交易类型
type TransactionType string

const (
	Income  TransactionType = "收入"
	Expense TransactionType = "支出"
)

// 交易记录
type Transaction struct {
	ID          int             `json:"id"`
	Type        TransactionType `json:"type"`
	Amount      float64         `json:"amount"`
	Category    string          `json:"category"`
	Description string          `json:"description"`
	Date        time.Time       `json:"date"`
}

// 记账系统
type ExpenseTracker struct {
	transactions []Transaction
	nextID       int
	filename     string
}

// 创建新的记账系统
func NewExpenseTracker(filename string) *ExpenseTracker {
	et := &ExpenseTracker{
		transactions: make([]Transaction, 0),
		nextID:       1,
		filename:     filename,
	}
	et.loadData()
	return et
}

// 添加交易记录
func (et *ExpenseTracker) AddTransaction(transType TransactionType, amount float64, category, description string) error {
	if amount <= 0 {
		return fmt.Errorf("金额必须大于0")
	}

	transaction := Transaction{
		ID:          et.nextID,
		Type:        transType,
		Amount:      amount,
		Category:    category,
		Description: description,
		Date:        time.Now(),
	}

	et.transactions = append(et.transactions, transaction)
	et.nextID++

	return et.saveData()
}

// 获取所有交易记录
func (et *ExpenseTracker) GetAllTransactions() []Transaction {
	return et.transactions
}

// 获取收入总额
func (et *ExpenseTracker) GetTotalIncome() float64 {
	var total float64
	for _, t := range et.transactions {
		if t.Type == Income {
			total += t.Amount
		}
	}
	return total
}

// 获取支出总额
func (et *ExpenseTracker) GetTotalExpense() float64 {
	var total float64
	for _, t := range et.transactions {
		if t.Type == Expense {
			total += t.Amount
		}
	}
	return total
}

// 获取余额
func (et *ExpenseTracker) GetBalance() float64 {
	return et.GetTotalIncome() - et.GetTotalExpense()
}

// 按类别统计支出
func (et *ExpenseTracker) GetExpenseByCategory() map[string]float64 {
	categoryExpense := make(map[string]float64)
	for _, t := range et.transactions {
		if t.Type == Expense {
			categoryExpense[t.Category] += t.Amount
		}
	}
	return categoryExpense
}

// 删除交易记录
func (et *ExpenseTracker) DeleteTransaction(id int) error {
	for i, t := range et.transactions {
		if t.ID == id {
			et.transactions = append(et.transactions[:i], et.transactions[i+1:]...)
			return et.saveData()
		}
	}
	return fmt.Errorf("找不到ID为 %d 的交易记录", id)
}

// 保存数据到文件
func (et *ExpenseTracker) saveData() error {
	file, err := os.Create(et.filename)
	if err != nil {
		return fmt.Errorf("无法创建文件: %v", err)
	}
	defer file.Close()

	encoder := json.NewEncoder(file)
	encoder.SetIndent("", "  ")
	return encoder.Encode(et.transactions)
}

// 从文件加载数据
func (et *ExpenseTracker) loadData() error {
	file, err := os.Open(et.filename)
	if err != nil {
		// 如果文件不存在,返回nil(使用空数据)
		if os.IsNotExist(err) {
			return nil
		}
		return fmt.Errorf("无法打开文件: %v", err)
	}
	defer file.Close()

	decoder := json.NewDecoder(file)
	err = decoder.Decode(&et.transactions)
	if err != nil {
		return fmt.Errorf("无法解析JSON: %v", err)
	}

	// 更新nextID
	maxID := 0
	for _, t := range et.transactions {
		if t.ID > maxID {
			maxID = t.ID
		}
	}
	et.nextID = maxID + 1

	return nil
}

// 应用程序结构
type App struct {
	tracker *ExpenseTracker
	scanner *bufio.Scanner
}

// 创建新应用
func NewApp() *App {
	return &App{
		tracker: NewExpenseTracker("expenses.json"),
		scanner: bufio.NewScanner(os.Stdin),
	}
}

// 运行应用
func (app *App) Run() {
	fmt.Println("===============================")
	fmt.Println("    欢迎使用个人记账系统")
	fmt.Println("===============================")
	
	for {
		app.showMenu()
		choice := app.getUserInput("请选择操作 (1-7): ")
		
		switch choice {
		case "1":
			app.addIncome()
		case "2":
			app.addExpense()
		case "3":
			app.viewTransactions()
		case "4":
			app.viewSummary()
		case "5":
			app.viewCategoryReport()
		case "6":
			app.deleteTransaction()
		case "7":
			fmt.Println("感谢使用记账系统,再见!")
			return
		default:
			fmt.Println("无效选择,请重新输入")
		}
		
		fmt.Println("\n按回车键继续...")
		app.scanner.Scan()
	}
}

// 显示菜单
func (app *App) showMenu() {
	fmt.Println("\n=============== 主菜单 ===============")
	fmt.Println("1. 添加收入")
	fmt.Println("2. 添加支出")
	fmt.Println("3. 查看交易记录")
	fmt.Println("4. 查看财务摘要")
	fmt.Println("5. 查看分类报告")
	fmt.Println("6. 删除交易记录")
	fmt.Println("7. 退出")
	fmt.Println("====================================")
}

// 获取用户输入
func (app *App) getUserInput(prompt string) string {
	fmt.Print(prompt)
	app.scanner.Scan()
	return strings.TrimSpace(app.scanner.Text())
}

// 添加收入
func (app *App) addIncome() {
	fmt.Println("\n--- 添加收入 ---")
	
	amountStr := app.getUserInput("请输入收入金额: ")
	amount, err := strconv.ParseFloat(amountStr, 64)
	if err != nil {
		fmt.Println("无效的金额格式")
		return
	}
	
	category := app.getUserInput("请输入收入类别 (如: 工资, 奖金, 投资): ")
	if category == "" {
		category = "其他"
	}
	
	description := app.getUserInput("请输入描述 (可选): ")
	
	err = app.tracker.AddTransaction(Income, amount, category, description)
	if err != nil {
		fmt.Printf("添加失败: %v\n", err)
		return
	}
	
	fmt.Printf("成功添加收入: %.2f 元\n", amount)
}

// 添加支出
func (app *App) addExpense() {
	fmt.Println("\n--- 添加支出 ---")
	
	amountStr := app.getUserInput("请输入支出金额: ")
	amount, err := strconv.ParseFloat(amountStr, 64)
	if err != nil {
		fmt.Println("无效的金额格式")
		return
	}
	
	category := app.getUserInput("请输入支出类别 (如: 餐饮, 交通, 购物): ")
	if category == "" {
		category = "其他"
	}
	
	description := app.getUserInput("请输入描述 (可选): ")
	
	err = app.tracker.AddTransaction(Expense, amount, category, description)
	if err != nil {
		fmt.Printf("添加失败: %v\n", err)
		return
	}
	
	fmt.Printf("成功添加支出: %.2f 元\n", amount)
}

// 查看交易记录
func (app *App) viewTransactions() {
	fmt.Println("\n--- 交易记录 ---")
	
	transactions := app.tracker.GetAllTransactions()
	if len(transactions) == 0 {
		fmt.Println("暂无交易记录")
		return
	}
	
	fmt.Printf("%-4s %-8s %-10s %-12s %-20s %s\n", 
		"ID", "类型", "金额", "类别", "描述", "日期")
	fmt.Println(strings.Repeat("-", 80))
	
	for _, t := range transactions {
		fmt.Printf("%-4d %-8s %-10.2f %-12s %-20s %s\n",
			t.ID,
			t.Type,
			t.Amount,
			t.Category,
			t.Description,
			t.Date.Format("2006-01-02 15:04"),
		)
	}
}

// 查看财务摘要
func (app *App) viewSummary() {
	fmt.Println("\n--- 财务摘要 ---")
	
	totalIncome := app.tracker.GetTotalIncome()
	totalExpense := app.tracker.GetTotalExpense()
	balance := app.tracker.GetBalance()
	
	fmt.Printf("总收入:   %.2f 元\n", totalIncome)
	fmt.Printf("总支出:   %.2f 元\n", totalExpense)
	fmt.Printf("当前余额: %.2f 元\n", balance)
	
	if balance > 0 {
		fmt.Println("💰 很好,您有盈余!")
	} else if balance < 0 {
		fmt.Println("⚠️  警告:您的支出超过了收入!")
	} else {
		fmt.Println("📊 收支平衡")
	}
}

// 查看分类报告
func (app *App) viewCategoryReport() {
	fmt.Println("\n--- 支出分类报告 ---")
	
	categoryExpense := app.tracker.GetExpenseByCategory()
	if len(categoryExpense) == 0 {
		fmt.Println("暂无支出记录")
		return
	}
	
	fmt.Printf("%-15s %s\n", "类别", "金额")
	fmt.Println(strings.Repeat("-", 25))
	
	for category, amount := range categoryExpense {
		fmt.Printf("%-15s %.2f 元\n", category, amount)
	}
	
	// 找出最大支出类别
	maxCategory := ""
	maxAmount := 0.0
	for category, amount := range categoryExpense {
		if amount > maxAmount {
			maxAmount = amount
			maxCategory = category
		}
	}
	
	if maxCategory != "" {
		fmt.Printf("\n💡 最大支出类别: %s (%.2f 元)\n", maxCategory, maxAmount)
	}
}

// 删除交易记录
func (app *App) deleteTransaction() {
	fmt.Println("\n--- 删除交易记录 ---")
	
	// 先显示所有交易记录
	app.viewTransactions()
	
	idStr := app.getUserInput("请输入要删除的交易ID: ")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		fmt.Println("无效的ID格式")
		return
	}
	
	confirm := app.getUserInput("确认删除吗?(y/N): ")
	if strings.ToLower(confirm) != "y" && strings.ToLower(confirm) != "yes" {
		fmt.Println("取消删除")
		return
	}
	
	err = app.tracker.DeleteTransaction(id)
	if err != nil {
		fmt.Printf("删除失败: %v\n", err)
		return
	}
	
	fmt.Println("交易记录删除成功!")
}

// 主函数
func main() {
	app := NewApp()
	app.Run()
}

我们去运行一下代码,不知道怎么运行go语言的同学可以去看下上节内容:

完美运行! 基本代码流程及核心代码详解见下章(超快更新)。

总结

    这将是一个长系列的模块,从下载到项目的落地都会在此板块更新!!记录项目从无到有的过程,出现问题!有兴趣的盆友可以一起交流学习!留个关注,蟹蟹!!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐