大家好,我正在编写关于创建地图的代码,在该地图上我们有两件事:书名和书号,如果书名看起来像“哈利·波特”,那么我就陷入一件事,只有我的代码添加哈利和我想在我的切片中添加 Harry 之后的所有内容,但是 golang 给出错误并说你不能将切片添加到地图,只能添加一个字符串内容,我不知道如何修复它
这是我的代码
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
//how much data you want add and delete
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()
info := strings.Fields(scanner.Text())
//if he want to add datas
if info[0] == "ADD" {
var z, _ = strconv.Atoi(info[1])
mymap[z] = info[2]
//if he want remove datas
} else if info[0] == "REMOVE" {
x := info[1]
var z, _ = strconv.Atoi(x)
delete(mymap, z)
}
}
fmt.Println(mymap)
}
所以我愿意
mymap[z] = info[2:]
但这不起作用,这是我的问题
info[2:]
将返回一个字符串切片。
要解决错误并接受书籍的全名,您可能需要将从 info[2:]
获取的切片连接起来以形成完整的字符串。
因此,使用 strings.Join(info[2:], " ")
将解决该问题。
更新的代码片段:
mymap[z] = strings.Join(info[2:], " ")
info
将是 []string
例如{"ADD", "1", "Harry", "Potter"}
并且您想要将 info[2:]
转换为 string
(即“哈利·波特”),其中元素之间用空格分隔(部分反转 strings.Fields
)。 strings.Join
可能是最简单的方法(playground):
func main() {
testInput := []string{ // simulate input
"ADD 1 Harry Potter",
"ADD 1 Harry Potter",
"ADD 1 Lord of the rings",
"REMOVE 2 Harry Potter",
}
mymap := make(map[int]string)
for _, command := range testInput {
info := strings.Fields(command)
//if he want to add datas
if info[0] == "ADD" {
var z, _ = strconv.Atoi(info[1])
mymap[z] = strings.Join(info[2:], " ")
//if he want remove datas
} else if info[0] == "REMOVE" {
x := info[1]
var z, _ = strconv.Atoi(x)
delete(mymap, z)
}
}
fmt.Println(mymap)
}
注意:生成的字符串可能与您的输入不完全匹配(例如,多个空格会丢失),但这对于您的用例来说可能并不重要。
我会注意到您的代码可能没有执行您想要的操作。考虑
添加 1 个哈利波特
添加1个狮子女巫
添加 1 指环王
会导致
map[1:Lord of the rings]
(可能不是你想要的)。