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)
// ... 其余代码不变
}
主要修复了全局变量导致的竞态条件和数组越界问题,使代码更加健壮和安全。

