Golang项目合集

Golang项目合集 大家好!

我目前正在用 Go 语言重写我的创业项目——一个薪资支付系统。这不是我第一次使用 Go,尽管我只是偶尔使用。如果有人能提供建议、开源资源,或者愿意帮助我完成搭建工作,我将不胜感激!

1 回复

更多关于Golang项目合集的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是一个基于Go语言的薪资支付系统核心模块示例,包含结构定义、JSON序列化和并发处理:

package main

import (
	"encoding/json"
	"fmt"
	"sync"
	"time"
)

// 员工薪资结构
type EmployeeSalary struct {
	ID        string    `json:"id"`
	Name      string    `json:"name"`
	BaseSalary float64   `json:"base_salary"`
	Bonus     float64   `json:"bonus"`
	TaxRate   float64   `json:"tax_rate"`
	PayDate   time.Time `json:"pay_date"`
}

// 计算实发薪资
func (es *EmployeeSalary) CalculateNetSalary() float64 {
	tax := (es.BaseSalary + es.Bonus) * es.TaxRate
	return es.BaseSalary + es.Bonus - tax
}

// 薪资处理器
type PayrollProcessor struct {
	mu       sync.RWMutex
	records  map[string]*EmployeeSalary
}

func NewPayrollProcessor() *PayrollProcessor {
	return &PayrollProcessor{
		records: make(map[string]*EmployeeSalary),
	}
}

// 并发安全的薪资记录添加
func (pp *PayrollProcessor) AddSalaryRecord(emp *EmployeeSalary) {
	pp.mu.Lock()
	defer pp.mu.Unlock()
	emp.PayDate = time.Now()
	pp.records[emp.ID] = emp
}

// 批量处理薪资计算
func (pp *PayrollProcessor) ProcessBatch(employees []EmployeeSalary) map[string]float64 {
	var wg sync.WaitGroup
	results := make(map[string]float64)
	resultChan := make(chan struct {
		id   string
		net  float64
	}, len(employees))

	for _, emp := range employees {
		wg.Add(1)
		go func(e EmployeeSalary) {
			defer wg.Done()
			netSalary := e.CalculateNetSalary()
			resultChan <- struct {
				id   string
				net  float64
			}{e.ID, netSalary}
		}(emp)
	}

	go func() {
		wg.Wait()
		close(resultChan)
	}()

	for result := range resultChan {
		results[result.id] = result.net
	}

	return results
}

// 生成JSON格式的薪资报告
func (pp *PayrollProcessor) GenerateReport() ([]byte, error) {
	pp.mu.RLock()
	defer pp.mu.RUnlock()

	var report []EmployeeSalary
	for _, record := range pp.records {
		report = append(report, *record)
	}

	return json.MarshalIndent(report, "", "  ")
}

func main() {
	// 初始化处理器
	processor := NewPayrollProcessor()

	// 示例员工数据
	employees := []EmployeeSalary{
		{ID: "E001", Name: "张三", BaseSalary: 15000, Bonus: 3000, TaxRate: 0.1},
		{ID: "E002", Name: "李四", BaseSalary: 18000, Bonus: 2500, TaxRate: 0.12},
		{ID: "E003", Name: "王五", BaseSalary: 22000, Bonus: 4000, TaxRate: 0.15},
	}

	// 批量处理薪资计算
	results := processor.ProcessBatch(employees)
	fmt.Println("薪资计算结果:")
	for id, netSalary := range results {
		fmt.Printf("员工 %s: 实发薪资 %.2f\n", id, netSalary)
	}

	// 添加记录到处理器
	for i := range employees {
		processor.AddSalaryRecord(&employees[i])
	}

	// 生成报告
	report, err := processor.GenerateReport()
	if err != nil {
		fmt.Printf("生成报告失败: %v\n", err)
		return
	}

	fmt.Println("\nJSON格式薪资报告:")
	fmt.Println(string(report))
}

关键特性说明:

  1. 使用结构体标签定义JSON序列化格式
  2. 通过sync.RWMutex实现并发安全的数据访问
  3. 利用goroutine和channel进行并发薪资计算
  4. 提供完整的薪资计算逻辑和报表生成功能

这个示例展示了Go语言在构建薪资支付系统时的典型应用模式,包括并发处理、数据序列化和业务逻辑封装。可以根据实际需求扩展数据库集成、API接口和更复杂的薪资计算规则。

回到顶部