// 第 4 周 – Go 中的字符串基础
// 运行：go run ./w04/stringbasics
package main

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

func main() {
	s := "Hello, World"

	// 长度以字节计，下标访问得到一个字节 – O(1)
	fmt.Println("len =", len(s), ", s[4] =", s[4], "=", string(s[4]))

	// 字符串是不可变的：s[0] = 'h' 会导致编译错误
	upper := strings.ToUpper(s)
	fmt.Println("s =", s, ", upper =", upper)

	// 比较：在 Go 中 == 比较的是内容
	a := "data"
	b := strings.Repeat("da", 1) + "ta"
	fmt.Println("a == b:", a == b)

	// 字典序比较：用 <、> 或 strings.Compare
	fmt.Println(`"apple" < "banana":`, "apple" < "banana", `, "Zebra" < "apple":`, "Zebra" < "apple")
	fmt.Println("EqualFold:", strings.EqualFold("Go", "GO"))

	// 查找
	fmt.Println("Index(o) =", strings.Index(s, "o"), ", LastIndex(o) =", strings.LastIndex(s, "o"),
		", Contains(World) =", strings.Contains(s, "World"))

	// 用切片取子串：[start:end) – 字节下标！
	fmt.Println("s[7:] =", s[7:], ", s[:5] =", s[:5])

	// 分割、连接
	parts := strings.Split("Wuhan,Beijing,Shanghai", ",")
	fmt.Printf("Split: %q\n", parts)
	fmt.Println("Join: ", strings.Join(parts, " | "))
	fmt.Println("Fields:", strings.Fields("  between   several  spaces "))

	// 替换、去除首尾字符
	fmt.Println("ReplaceAll:", strings.ReplaceAll(s, "World", "Hubei"))
	fmt.Printf("TrimSpace: [%s]\n", strings.TrimSpace("   text   "))

	// 字符串 <-> byte/rune 切片
	r := []rune(s)
	sort.Slice(r, func(i, j int) bool { return r[i] < r[j] })
	fmt.Println("sorted characters:", strings.TrimSpace(string(r)))

	// 数字 <-> 字符串
	n, err := strconv.Atoi("42")
	fmt.Println("Atoi + 1 =", n+1, err, ", Itoa =", strconv.Itoa(7)+"!")
}
