Golang代码求点评:请帮我看看这段代码有什么问题

Golang代码求点评:请帮我看看这段代码有什么问题

type FinalResult struct {
+	TbMissingIssues        int
+	FieldMissingIssues     int
+	ApiIssuesJson          int
+	FieldMissingIssuesJson int
+	JsonVsDbTyIssues       int
+	TotalIssues            int
+}
+
+var rst FinalResult
+
+func TestResult(result string) *FinalResult {
+
+	inputScan := bufio.NewScanner(strings.NewReader(result))
+
+	for inputScan.Scan() {
+
+		lineStr := inputScan.Text()
+
+		switch {
+
+		case strings.Contains(lineStr, "Tables Missing"):
+
+			rst.TbMissingIssues += cntResult(lineStr)
+
+			rst.TotalIssues += cntResult(lineStr)
+
+		case strings.Contains(lineStr, "Fields Missing"):
+
+			rst.FieldMissingIssues += cntResult(lineStr)
+			rst.TotalIssues += cntResult(lineStr)
+
+		case strings.Contains(lineStr, "API Level Errors"):
+
+			rst.ApiIssuesJson += cntResult(lineStr)
+			rst.TotalIssues += cntResult(lineStr)
+
+		case strings.Contains(lineStr, "JSON vs DB Type Mismatch"):
+
+			rst.JsonVsDbTyIssues += cntResult(lineStr)
+			rst.TotalIssues += cntResult(lineStr)
+
+		case strings.Contains(lineStr, "Field Level Errors"):
+
+			rst.FieldMissingIssuesJson += cntResult(lineStr)
+			rst.TotalIssues += cntResult(lineStr)
+
+		}
+	}
+
+	return &rst
+}
+func cntResult(lineStr string) (cntValue int) {
+
+	reg := regexp.MustCompile("[0-9]+")
+
+	cntValue = 0
+
+	if len(reg.FindAllString(lineStr, -1)[0]) == 1 {
+
+		cnt, err := strconv.Atoi(reg.FindAllString(lineStr, -1)[0])
+
+		if err != nil {
+
+			fmt.Println("Conversion Error from string into int", err.Error())
+		}
+
+		cntValue = cnt
+
+	}
+	return
+}

更多关于Golang代码求点评:请帮我看看这段代码有什么问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

能否请您发布实际的 Go 代码而不是差异对比?

同时如果能说明您想通过这段代码实现什么目标会更好。提前了解代码的预期功能会让审查过程更加轻松。

更多关于Golang代码求点评:请帮我看看这段代码有什么问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你在TestResult外部将rst定义为全局变量,但却返回它的指针。你应该在函数内部定义rst。关于性能方面,if-else语句应该比switch块更好。

在cntResult函数中,你将cntValue设置为0,但这是多余的,因为int类型的默认值已经是0。你可以直接去掉cntValue变量并直接返回值。

如果你能提供这些函数的输入样例,就可以避免使用正则表达式,正则表达式计算量很大,根据使用场景会影响性能。

这段代码有几个主要问题需要修复:

1. 全局变量问题

使用全局变量 rst 会导致数据污染,特别是在并发场景下:

// 问题:全局变量在多处调用时会互相覆盖
var rst FinalResult

// 修复:在函数内部创建实例
func TestResult(result string) *FinalResult {
    rst := &FinalResult{} // 每次调用创建新实例
    // ... 其余代码
    return rst
}

2. 正则匹配数组越界

cntResult 函数没有检查 FindAllString 返回的数组是否为空:

func cntResult(lineStr string) int {
    reg := regexp.MustCompile("[0-9]+")
    matches := reg.FindAllString(lineStr, -1)
    
    if len(matches) == 0 {
        return 0
    }
    
    cnt, err := strconv.Atoi(matches[0])
    if err != nil {
        return 0
    }
    
    return cnt
}

3. 不必要的长度检查

原代码中 len(matches[0]) == 1 的限制没有意义,应该移除。

4. 改进后的完整代码

type FinalResult struct {
    TbMissingIssues        int
    FieldMissingIssues     int
    ApiIssuesJson          int
    FieldMissingIssuesJson int
    JsonVsDbTyIssues       int
    TotalIssues            int
}

func TestResult(result string) *FinalResult {
    rst := &FinalResult{}
    inputScan := bufio.NewScanner(strings.NewReader(result))

    for inputScan.Scan() {
        lineStr := inputScan.Text()
        count := cntResult(lineStr)

        switch {
        case strings.Contains(lineStr, "Tables Missing"):
            rst.TbMissingIssues += count
            rst.TotalIssues += count
        case strings.Contains(lineStr, "Fields Missing"):
            rst.FieldMissingIssues += count
            rst.TotalIssues += count
        case strings.Contains(lineStr, "API Level Errors"):
            rst.ApiIssuesJson += count
            rst.TotalIssues += count
        case strings.Contains(lineStr, "JSON vs DB Type Mismatch"):
            rst.JsonVsDbTyIssues += count
            rst.TotalIssues += count
        case strings.Contains(lineStr, "Field Level Errors"):
            rst.FieldMissingIssuesJson += count
            rst.TotalIssues += count
        }
    }

    return rst
}

func cntResult(lineStr string) int {
    reg := regexp.MustCompile(`\d+`)
    matches := reg.FindAllString(lineStr, -1)
    
    if len(matches) == 0 {
        return 0
    }
    
    cnt, err := strconv.Atoi(matches[0])
    if err != nil {
        return 0
    }
    
    return cnt
}

5. 潜在的性能优化

如果处理大量数据,考虑预编译正则表达式:

var numberRegex = regexp.MustCompile(`\d+`)

func cntResult(lineStr string) int {
    matches := numberRegex.FindAllString(lineStr, -1)
    // ... 其余代码不变
}

主要修复了全局变量导致的竞态条件和数组越界问题,使代码更加健壮和安全。

回到顶部