String 删除Golang中周围的双引号或单引号

String 删除Golang中周围的双引号或单引号,string,go,String,Go,strconv.Unquote不应该同时处理单引号和双引号吗 另见第350行 但是,以下代码返回一个语法错误: s,err:=strconv.Unquote(`test`) 如果出错!=零{ fmt.Println(错误) }否则{ fmt.Println(s) } 但双引号的作用与预期一样: 我缺少什么?临时解决方案: func trimQuotes(s string) string { if len(s) >= 2 { switch {

strconv.Unquote
不应该同时处理单引号和双引号吗

另见第350行

但是,以下代码返回一个
语法错误

s,err:=strconv.Unquote(`test`)
如果出错!=零{
fmt.Println(错误)
}否则{
fmt.Println(s)
}

但双引号的作用与预期一样:

我缺少什么?

临时解决方案:

func trimQuotes(s string) string {
    if len(s) >= 2 {
        switch {
          case s[0] == '"' && s[len(s)-1] == '"':
            return s[1 : len(s)-1]
          case s[0] == '\'' && s[len(s)-1] == '\'':
            return s[1 : len(s)-1]
        }
    }
    return s
}

strconv.Unquote
可以正确地处理单引号和双引号,但它并不打算以代码段调用它的方式使用。它用于处理go源代码时遇到字符串文本的情况。单引号大小写对单个字符有效,而不是字符串。在go源文件中,如果尝试对多字符串文字使用单引号,则会出现类似于
非法符文文字的编译器错误

您可以使用
strings.Trim
函数来处理从字符串开头和结尾删除引号的操作

s := strings.Trim(`'test'`, `'"`)
fmt.Println(s)

标准库中没有您想要的现成函数

您介绍的内容有效,但我们可以使其更简单(并且可能更有效):

测试它:

fmt.Println(trimQuotes(`'test'`))
fmt.Println(trimQuotes(`"test"`))
fmt.Println(trimQuotes(`"'test`))
输出(在上尝试):


Unquote用于Go语法文字。从:
如果s是单引号,它将是一个Go字符文本
为什么不使用字符串。替换?此外,在99%的情况下,如果您不使用“else-if”,则在Go中使用
switch
语句更为惯用。在某些情况下,它们可能会稍微紧凑一些(特别是字符串if
|
子句,因为您可以在同一个开关中用逗号分隔它们),并且通常更易于阅读。从编译器的角度来看,两者完全相同,因此这纯粹是一个可读性问题。使用条件的示例:@Kaedys-because
Orig:'te“st'| unquote:test
更新为使用switch而不是if/else-感谢您的评论,但是任何人都可以看到
Replace
根本不提供相同的行为。无论如何,@jimB提供了预期的答案,如果他将其作为答案发布,我很乐意接受。strings.Trim()
的问题是,它会将
“'abc
变成
abc
,即使在这种情况下,asker希望它保持
”“'abc
。尽管你的答案与我的答案几乎相同,除了对我投的反对票
func trimQuotes(s string) string {
    if len(s) >= 2 {
        if c := s[len(s)-1]; s[0] == c && (c == '"' || c == '\'') {
            return s[1 : len(s)-1]
        }
    }
    return s
}
fmt.Println(trimQuotes(`'test'`))
fmt.Println(trimQuotes(`"test"`))
fmt.Println(trimQuotes(`"'test`))
test
test
"'test