Golang中SSE职位挑战的代码评审求助

Golang中SSE职位挑战的代码评审求助 Screenshot 2021-04-05 at 8.55.54 PM

Screenshot 2021-04-05 at 8.55.45 PM

我尝试解决了上述挑战,我在一小时内想出的代码看起来像这样,我遗漏了一些东西,我也知道这一点。但我能改进什么以及如何改进?特别是对于第二部分我得到的反馈,我不太理解。他说解决方案不正确(实现不正确)。

我遗漏的事项:

  • 表格测试
  • 我无法组织代码结构,所以我采用了一种取巧的方法,创建了一个可执行文件,然后简单地更改包名以便测试能够运行。

更多关于Golang中SSE职位挑战的代码评审求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

提示: 在B部分中,你只有一个goroutine。

更多关于Golang中SSE职位挑战的代码评审求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的。而且由于某些原因,我无法理解接下来该做什么。

代码评审分析

从你提供的截图和代码仓库来看,这是一个处理字符串格式化和解析的挑战。让我分析你的实现并提供改进建议:

主要问题分析

第一部分:字符串格式化 你的FormatString函数基本正确,但可以更简洁:

// 当前实现可以简化为
func FormatString(s string) string {
    var result strings.Builder
    for i, r := range s {
        if i > 0 {
            result.WriteRune('_')
        }
        result.WriteRune(r)
    }
    return result.String()
}

第二部分:字符串解析(主要问题) 根据反馈"实现不正确",你的ParseString函数存在逻辑错误:

// 你的当前实现有问题
func ParseString(s string) []string {
    // 问题:当遇到连续分隔符时,会生成空字符串
    // 例如:"a__b" 应该返回 ["a", "b"],但你的实现会返回 ["a", "", "b"]
    
    // 正确的实现应该是:
    var result []string
    var current strings.Builder
    
    for _, r := range s {
        if r == '_' {
            if current.Len() > 0 {
                result = append(result, current.String())
                current.Reset()
            }
        } else {
            current.WriteRune(r)
        }
    }
    
    // 处理最后一个部分
    if current.Len() > 0 {
        result = append(result, current.String())
    }
    
    return result
}

测试改进

你需要添加表格测试来覆盖边界情况:

func TestFormatString(t *testing.T) {
    tests := []struct {
        name     string
        input    []string
        expected string
    }{
        {"single character", []string{"a"}, "a"},
        {"multiple strings", []string{"a", "b", "c"}, "a_b_c"},
        {"empty slice", []string{}, ""},
        {"with empty strings", []string{"a", "", "c"}, "a__c"},
    }
    
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            got := FormatString(tt.input...)
            if got != tt.expected {
                t.Errorf("FormatString() = %v, want %v", got, tt.expected)
            }
        })
    }
}

func TestParseString(t *testing.T) {
    tests := []struct {
        name     string
        input    string
        expected []string
    }{
        {"single character", "a", []string{"a"}},
        {"normal case", "a_b_c", []string{"a", "b", "c"}},
        {"empty string", "", []string{}},
        {"multiple separators", "a__b", []string{"a", "b"}},
        {"trailing separator", "a_b_", []string{"a", "b"}},
        {"leading separator", "_a_b", []string{"a", "b"}},
    }
    
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            got := ParseString(tt.input)
            if !reflect.DeepEqual(got, tt.expected) {
                t.Errorf("ParseString() = %v, want %v", got, tt.expected)
            }
        })
    }
}

代码组织改进

不要通过修改包名来测试,正确的方式是:

  1. 创建独立的包结构:
sonu_challenge/
├── go.mod
├── format/
│   ├── format.go
│   └── format_test.go
└── cmd/
    └── main.go
  1. format.go:
package format

import "strings"

func FormatString(parts ...string) string {
    return strings.Join(parts, "_")
}

func ParseString(s string) []string {
    var result []string
    var current strings.Builder
    
    for _, r := range s {
        if r == '_' {
            if current.Len() > 0 {
                result = append(result, current.String())
                current.Reset()
            }
        } else {
            current.WriteRune(r)
        }
    }
    
    if current.Len() > 0 {
        result = append(result, current.String())
    }
    
    return result
}
  1. 使用正确的测试命令:
# 在format目录下运行测试
cd format
go test -v

# 或者从项目根目录
go test ./format/...

性能考虑

对于SSE职位,他们可能关注性能。考虑使用预分配:

func ParseStringOptimized(s string) []string {
    // 预估计结果切片大小
    estimated := strings.Count(s, "_") + 1
    result := make([]string, 0, estimated)
    
    // ... 其余逻辑相同
    return result
}

关键改进点总结:

  1. 修复ParseString逻辑:正确处理连续分隔符和边界情况
  2. 添加全面的表格测试:覆盖所有边界条件
  3. 改进代码组织:使用标准的Go项目结构
  4. 考虑性能优化:使用strings.Builder和预分配
  5. 错误处理:考虑添加输入验证(如果需要)

你的主要问题是ParseString函数没有正确处理连续分隔符的情况,这导致了"实现不正确"的反馈。修复这个逻辑错误并添加全面的测试应该能解决大部分问题。

回到顶部