Go语言中如何将切片元素合并为字符串存入map?
问题分析
你的问题出在strings.Fields()的使用上——这个函数会把输入字符串按所有空白字符分割成切片,所以像ADD 1 Harry Potter这样的输入会被拆成["ADD", "1", "Harry", "Potter"],你取info[2]自然只能拿到第一个词。而info[2:]是[]string类型,和你的map[int]string中值的类型不匹配,所以编译报错。
解决方案
要保留带空格的书名,你需要换一种分割方式:只分割前两个空格,把剩下的部分作为完整书名。推荐用strings.SplitN()函数,它可以指定分割的最大次数。
修改后的完整代码
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { scanner := bufio.NewScanner(os.Stdin) scanner.Scan() num, _ := strconv.Atoi(scanner.Text()) mymap := make(map[int]string) for i := 0; i < num; i++ { scanner.Scan() input := scanner.Text() // 按空格分割成最多3部分:命令、编号、书名(含空格) parts := strings.SplitN(input, " ", 3) if parts[0] == "ADD" { z, _ := strconv.Atoi(parts[1]) // parts[2]就是完整的带空格的书名 mymap[z] = parts[2] } else if parts[0] == "REMOVE" { z, _ := strconv.Atoi(parts[1]) delete(mymap, z) } } fmt.Println(mymap) }
为什么这样可行?
strings.SplitN(input, " ", 3)会把输入字符串从左到右分割最多2次(得到3个元素):
- 第一个元素是命令(
ADD/REMOVE) - 第二个元素是书籍编号
- 第三个元素是从第二个空格开始到结尾的所有内容,完美保留书名里的空格
比如输入ADD 2 The Lord of the Rings,parts会是["ADD", "2", "The Lord of the Rings"],直接取parts[2]就能得到完整书名。
内容的提问来源于stack exchange,提问作者Sepehr
相关产品推荐
相关产品推荐

