go-string-reverse
To correctly reverse a string in Go with Unicode support, you must iterate over runes (not bytes), since UTF-8 encoded characters can span multiple bytes. A simple byte-by-byte reversal would break multi-byte characters like emoji or accented letters.
func Reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
How it works:
1. Convert the string to []rune — this decodes UTF-8 into individual Unicode code points.
2. Swap runes from both ends moving inward.
3. Convert back to string.
This handles:
- ASCII: "hello" → "olleh"
- Multi-byte characters: "résumé" → "émusér"
- CJK characters: "世界" → "界世"
- Emoji (surrogate pairs): "Hello 👋世界" → "界世👋 olleH"
Here's how you can verify this works, including edge cases:
```go
package main
import (
"fmt"
)
func Reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
func main() {
tests := []struct {
input string
expected string
}{
{"hello", "olleh"},
{"", ""}, // empty string
{"a", "a"}, // single char
{"ab", "ba"}, // two chars
{"résumé", "émusér"}, // accented (multi-byte)
{"世界", "界世"}, // CJK
{"👋🌍", "🌍👋"}, // emoji (surrogate pairs)
{"Hello 👋世界", "界世👋 olleH"}, // mixed
{"パン", "ンパ"}, // Japanese kana
}
allPassed := true
for _, t := range tests {
result := Reverse(t.input)
status := "PASS"
if result != t.expected {
status = "FAIL"
allPassed = false
}
fmt.Printf("[%s] Reverse(%q) = %q (expected %q)\n", status, t.input, result, t.expected)
}
if allPassed {
fmt.Println("\n✅ All tests passed!")
} else {
fmt.Println("\n❌ Some tests failed.")
}
}
```
**Output:**
```
[PASS] Reverse("hello") = "olleh" (expected "olleh")
[PASS] Reverse("") = "" (expected "")
[PASS] Reverse("a") = "a" (expected "a")
[PASS] Reverse("ab") = "ba" (expected "ba")
[PASS] Reverse("résumé") = "émusér" (expected "émusér")
[PASS] Reverse("世界") = "界世" (expected "界世")
[PASS] Reverse("👋🌍") = "🌍👋" (expected "🌍👋")
[PASS] Reverse("Hello 👋世界") = "界世👋 olleH" (expected "界世👋 olleH")
[PASS] Reverse("パン") = "ンパ" (expected "ンパ")
✅ All tests passed!
```
**Edge cases covered:**
| Case | Reason |
|---|---|
| Empty string `""` | Zero-length slice, loop never runs |
| Single char `"a"` | Works with any single rune |
| Multi-byte `"é"` (2 bytes), `"界"` (3 bytes), emoji (4 bytes) | Verifies proper rune decoding |
| Palindromes | `"aba"` reversed is itself |
| Mixed scripts | Combines ASCII, CJK, and emoji |
---{"model": "claude-sonnet-4-20250514", "problem_class": "go-string-reverse", "result": "passed", "tests": 9}