Go语言CSV随机取名字函数输出带大括号问题求助
Go函数返回姓名带大括号的解决方法
问题根源
你当前用fmt.Sprintf("%s", persons[rName])直接格式化Person结构体,Go语言中结构体默认的字符串表示格式为{字段值},因此输出会带大括号。
直接解决方法
无需格式化整个结构体,直接返回结构体中的姓名字段即可:
return persons[rName].IMIEPIERWSZE
代码中的其他潜在问题及优化
- 索引越界风险:
rand.Intn(1000)+1000生成的索引可能远大于persons实际长度,会触发panic。应根据切片长度生成有效索引:if len(persons) == 0 { return "" // 或返回默认值、抛出错误 } rName := rand.Intn(len(persons)) - 表头索引映射错误:当前
headerMap[v] = 0会把所有表头都映射到第0列,正确做法是记录每个表头对应的列索引:if isFirstRow { isFirstRow = false for i, v := range record { headerMap[v] = i } continue } - 文件资源泄漏:
os.Open打开文件后未关闭,需添加defer f.Close()确保资源释放:f, err := os.Open(filePath) if err != nil { checkError("Failed to open file", err) return "" } defer f.Close() - 随机数序列固定:若未初始化随机数种子,每次运行生成的随机数会重复,建议在程序入口添加初始化逻辑:
func init() { rand.Seed(time.Now().UnixNano()) }
修改后的完整代码示例
import ( "encoding/csv" "io" "math/rand" "os" "time" ) type Person struct { IMIEPIERWSZE string } func checkError(msg string, err error) { if err != nil { panic(msg + ": " + err.Error()) } } func chosname(filePath string) string { var persons []Person isFirstRow := true headerMap := make(map[string]int) f, err := os.Open(filePath) if err != nil { checkError("Failed to open file", err) return "" } defer f.Close() r := csv.NewReader(f) for { record, err := r.Read() if err == io.EOF { break } checkError("Failed to read CSV row", err) if isFirstRow { isFirstRow = false for i, v := range record { headerMap[v] = i } continue } persons = append(persons, Person{ IMIEPIERWSZE: record[headerMap["IMIEPIERWSZE"]], }) } if len(persons) == 0 { return "" } rName := rand.Intn(len(persons)) return persons[rName].IMIEPIERWSZE } func init() { rand.Seed(time.Now().UnixNano()) }
内容的提问来源于stack exchange,提问作者0x0uer
相关产品推荐
相关产品推荐

