相比 Java 或 Python,Go 的字符串模型更为简洁,但需特别注意不可变性与 UTF-8 编码。
本文概述 Go 语言中的字符串特性、常用操作以及面试高频题型,帮助您在刷题、面试或调试生产代码时迅速查阅。Go 字符串具备以下特征: 不可变、支持 UTF-8 编码、底层由字节切片([]byte)实现。

一、基础语法与常用操作
1. 声明字符串
var s string = "hello"
s2 := "world"
2. 字符串不可变
尝试直接修改字符会导致编译错误:
s := "hello"
// s[0] = 'H' // ❌ 编译错误
3. 通过 []rune 修改字符
r := []rune(s)
r[0] = 'H'
s = string(r) // "Hello"
4. 字符串长度
len 返回字节长度而非字符数量:
len(s) // 字节数
5. 字符串拼接
s1 := "go"
s2 := "lang"
s3 := s1 + s2 // "golang"
6. 按字符遍历字符串
推荐方式,能正确处理 Unicode 与表情符号。
for _, ch := range s {
fmt.Printf("%c ", ch)
}
7. 字符串与 []byte 互转
b := []byte("hello")
s := string(b)
8. 字符串比较
if s1 == s2 {
fmt.Println("Equal")
}
9. strings 包常用函数
import "strings"
strings.ToLower("Go") // "go"
strings.ToUpper("go") // "GO"
strings.Contains("hello", "ll") // true
strings.HasPrefix("hello", "he") // true
strings.HasSuffix("hello", "lo") // true
strings.Split("a,b,c", ",") // []string{"a", "b", "c"}
strings.Join([]string{"a", "b"}, "-") // "a-b"
strings.ReplaceAll("foo bar foo", "foo", "baz") // "baz bar baz"
10. 去除空白
strings.TrimSpace(" hello ") // "hello"
二、高频字符串算法题
1. 反转字符串
func reverseString(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
2. 判断字母异位词
func isAnagram(s, t string) bool {
if len(s) != len(t) {
return false
}
freq := [26]int{}
for i := 0; i < len(s); i++ {
freq[s[i]-'a']++
freq[t[i]-'a']--
}
for _, v := range freq {
if v != 0 {
return false
}
}
return true
}
3. 无重复字符的最长子串
func lengthOfLongestSubstring(s string) int {
m := make(map[byte]int)
left, maxLen := 0, 0
for right := 0; right < len(s); right++ {
if idx, ok := m[s[right]]; ok && idx >= left {
left = idx + 1
}
m[s[right]] = right
if maxLen < right-left+1 {
maxLen = right - left + 1
}
}
return maxLen
}
4. 回文字符串检测
func isPalindrome(s string) bool {
l, r := 0, len(s)-1
for l < r {
if s[l] != s[r] {
return false
}
l++
r--
}
return true
}
5. 分组字母异位词
func groupAnagrams(strs []string) [][]string {
m := make(map[[26]int][]string)
for _, s := range strs {
var cnt [26]int
for _, ch := range s {
cnt[ch-'a']++
}
m[cnt] = append(m[cnt], s)
}
res := make([][]string, 0, len(m))
for _, group := range m {
res = append(res, group)
}
return res
}
6. 最长回文子串(中心扩展法)
func longestPalindrome(s string) string {
start, end := 0, 0
for i := 0; i < len(s); i++ {
l1, r1 := expand(s, i, i) // 奇数长度
l2, r2 := expand(s, i, i+1) // 偶数长度
if r1-l1 > end-start {
start, end = l1, r1
}
if r2-l2 > end-start {
start, end = l2, r2
}
}
return s[start : end+1]
}
func expand(s string, l, r int) (int, int) {
for l >= 0 && r < len(s) && s[l] == s[r] {
l--
r++
}
return l + 1, r - 1
}
7. 报数(Count and Say)
func countAndSay(n int) string {
if n == 1 {
return "1"
}
prev := countAndSay(n - 1)
result, count := "", 1
for i := 1; i < len(prev); i++ {
if prev[i] == prev[i-1] {
count++
} else {
result += fmt.Sprintf("%d%c", count, prev[i-1])
count = 1
}
}
result += fmt.Sprintf("%d%c", count, prev[len(prev)-1])
return result
}
三、Unicode 与 UTF-8
Go 字符串默认采用 UTF-8 编码。处理多字节字符或表情符号时,应转换为 []rune 或使用 utf8 包:
s := "नमस्ते"
fmt.Println(len(s)) // 字节数
fmt.Println(utf8.RuneCountInString(s)) // 实际字符数
四、结论
相比 Java 或 Python,Go 的字符串模型更为简洁,但需特别注意不可变性与 UTF-8 编码。熟练掌握转换、遍历及内存友好的操作模式,将帮助您高效解决与字符串相关的面试问题。
AI大模型学习福利
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量
2395

被折叠的 条评论
为什么被折叠?



