MST

星途 面试题库

面试题:Go语言strings包替换字符串的深度优化与场景适配

在一个高并发的Web服务中,会频繁收到形如`'user1:action1;user2:action2;...'`的字符串数据,需要将其中特定用户(例如`'user3'`)对应的`action`部分进行替换。请设计一个高效的基于strings包的解决方案,同时考虑内存使用、并发安全以及如何在大量请求下保持高性能,说明设计思路并给出关键代码片段。
36.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 字符串拆分:使用strings.Split函数将输入字符串按';'拆分,得到每个user:action对的切片。
  2. 查找特定用户:遍历切片,使用strings.SplitN函数将每个user:action对按':'拆分,找到特定用户(如user3)。
  3. 替换操作:找到特定用户后,替换其action部分。
  4. 重新拼接字符串:使用strings.Builder高效地重新拼接修改后的user:action对。
  5. 并发安全:使用sync.Mutex来保护共享资源,防止并发访问时的数据竞争。
  6. 性能优化:尽量减少内存分配和字符串复制操作,使用strings.Builder避免每次拼接都产生新的字符串。

关键代码片段

package main

import (
	"fmt"
	"strings"
	"sync"
)

var mu sync.Mutex

func replaceAction(input string, targetUser string, newAction string) string {
	mu.Lock()
	defer mu.Unlock()

	parts := strings.Split(input, ";")
	var result strings.Builder
	for i, part := range parts {
		subParts := strings.SplitN(part, ":", 2)
		if len(subParts) != 2 {
			continue
		}
		user := subParts[0]
		action := subParts[1]
		if user == targetUser {
			action = newAction
		}
		if i > 0 {
			result.WriteByte(';')
		}
		result.WriteString(user)
		result.WriteByte(':')
		result.WriteString(action)
	}
	return result.String()
}

你可以这样调用这个函数:

func main() {
	input := "user1:action1;user2:action2;user3:action3;user4:action4"
	targetUser := "user3"
	newAction := "newAction"
	output := replaceAction(input, targetUser, newAction)
	fmt.Println(output)
}