我可以删除字符串表示形式 ([]byte) 中的尾随零来比较字符串吗?
can I remove the trailing zeros in a strings representation ([]byte) to compare strings?
我需要在 Go 中比较字符串。
问题是:我想比较重音词 (café) 和它的非重音形式 (cafe)。
我做的第一件事是将重音 string
转换为非重音形式:
你可以运行这里的代码:https://play.golang.org/p/-eRUQeujZET
但每次我在字符串中进行这种转换时,它都会在最后添加更多 运行es。上面的例子打印:
bytes: [99 97 102 101 0] string: cafe
因为我需要比较从这个过程返回的字符串和它的对应字符串,首先没有'é',我需要从 [=13= 中删除最后一个 rune
(0) ].
在 运行 进行一些测试后,我发现最后的 0(有时它会添加多个)不会改变字符串表示形式。
我错过了什么吗?我可以删除 []byte
末尾的所有零吗?
这是我删除 0 并比较字符串的代码:
https://play.golang.org/p/HoueAGI4uUx
由于我们不能在这个领域独自工作,这里是我阅读的文章以达到我现在的位置:
https://blog.golang.org/strings
https://blog.golang.org/normalization
这是您的自定义 Transform()
函数:
func Transform(s string) ([]byte, error) {
var t transform.Transformer
t = transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
dst := make([]byte, len(s))
_, _, err := t.Transform(dst, []byte(s), true)
if err != nil {
return nil, err
}
return dst, nil
}
其中您使用的是 Transformer.Transform()
,它也是 return 写入目标的字节数。但是你不使用那个 return 值。
最简单的方法是存储 nDst
return 值,并对目标切片进行切片,因为它包含其中“有用”字节的数量(超过 nDst
的字节将保持前面 make()
电话交给您的 0
:
nDst, _, err := t.Transform(dst, []byte(s), true)
if err != nil {
return nil, err
}
return dst[:nDst], nil
进行此更改后,returned 切片将仅包含有用的字节,不带尾随零。
输出将是(在 Go Playground 上尝试):
2009/11/10 23:00:00 bytes: [99 97 102 101] string: cafe
我需要在 Go 中比较字符串。
问题是:我想比较重音词 (café) 和它的非重音形式 (cafe)。
我做的第一件事是将重音 string
转换为非重音形式:
你可以运行这里的代码:https://play.golang.org/p/-eRUQeujZET
但每次我在字符串中进行这种转换时,它都会在最后添加更多 运行es。上面的例子打印:
bytes: [99 97 102 101 0] string: cafe
因为我需要比较从这个过程返回的字符串和它的对应字符串,首先没有'é',我需要从 [=13= 中删除最后一个 rune
(0) ].
在 运行 进行一些测试后,我发现最后的 0(有时它会添加多个)不会改变字符串表示形式。
我错过了什么吗?我可以删除 []byte
末尾的所有零吗?
这是我删除 0 并比较字符串的代码:
https://play.golang.org/p/HoueAGI4uUx
由于我们不能在这个领域独自工作,这里是我阅读的文章以达到我现在的位置:
https://blog.golang.org/strings
https://blog.golang.org/normalization
这是您的自定义 Transform()
函数:
func Transform(s string) ([]byte, error) {
var t transform.Transformer
t = transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
dst := make([]byte, len(s))
_, _, err := t.Transform(dst, []byte(s), true)
if err != nil {
return nil, err
}
return dst, nil
}
其中您使用的是 Transformer.Transform()
,它也是 return 写入目标的字节数。但是你不使用那个 return 值。
最简单的方法是存储 nDst
return 值,并对目标切片进行切片,因为它包含其中“有用”字节的数量(超过 nDst
的字节将保持前面 make()
电话交给您的 0
:
nDst, _, err := t.Transform(dst, []byte(s), true)
if err != nil {
return nil, err
}
return dst[:nDst], nil
进行此更改后,returned 切片将仅包含有用的字节,不带尾随零。
输出将是(在 Go Playground 上尝试):
2009/11/10 23:00:00 bytes: [99 97 102 101] string: cafe