为了账号安全,请及时绑定邮箱和手机立即绑定

Golang:以独特的方式打印字符串数组

Golang:以独特的方式打印字符串数组

Go
慕斯709654 2022-03-03 16:03:41
我想要一个函数func format(s []string) string,以便两个字符串切片s1和s2,如果reflect.DeepEqual(s1, s2) == false,那么format(s1) != format(s2)。如果我简单地使用fmt.Sprint, slices["a", "b", "c"]并且["a b", "c"]都打印为[a b c],这是不可取的;并且还存在与string([]byte('4', 0, '2'))具有相同表示的问题"42"。
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

使用显示数据结构的格式动词,例如%#v. 在这种情况下%q也很有效,因为原始类型都是字符串。


fmt.Printf("%#v\n", []string{"a", "b", "c"})

fmt.Printf("%#v\n", []string{"a b", "c"})


// prints

// []string{"a", "b", "c"}

// []string{"a b", "c"}


查看完整回答
反对 回复 2022-03-03
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

您可以使用:


func format(s1, s2 []string) string {

    if reflect.DeepEqual(s1, s2) {

        return "%v\n"

    }

    return "%q\n"

}

像这个工作样本(The Go Playground):


package main


import (

    "fmt"

    "reflect"

)


func main() {

    s1, s2 := []string{"a", "b", "c"}, []string{"a b", "c"}

    frmat := format(s1, s2)

    fmt.Printf(frmat, s1) // ["a" "b" "c"]

    fmt.Printf(frmat, s2) // ["a b" "c"]


    s2 = []string{"a", "b", "c"}

    frmat = format(s1, s2)

    fmt.Printf(frmat, s1) // ["a" "b" "c"]

    fmt.Printf(frmat, s2) // ["a b" "c"]

}


func format(s1, s2 []string) string {

    if reflect.DeepEqual(s1, s2) {

        return "%v\n"

    }

    return "%q\n"

}

输出:


["a" "b" "c"]

["a b" "c"]

[a b c]

[a b c]


查看完整回答
反对 回复 2022-03-03
  • 2 回答
  • 0 关注
  • 409 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信