这可能是一个愚蠢的问题但是当我尝试将[]字节切片附加到[][]byte
切片时,我得到了奇怪的结果。
这是我的代码:
func Normalizer(s string) (ss [][]byte) {
ss = make([][]byte, 0)
// norm
var ia norm.Iter
ia.InitString(norm.NFC, s)
for !ia.Done() {
next := ia.Next()
fmt.Println(next)
// [226 128 139]
// [227 128 129]
// [39]
// [226 128 153]
// [46]
// [44]
// [63]
// [33]
// [92]
// [10]
// [226 128 153]
// ...
ss = append(ss, next)
}
ia.Done()
fmt.Println(ss)
return
}
我期待这样的事情:
// [[226 128 139] [227 128 129] [39] [226 128 153] [46] [44] [63] [33] [92] [10] [226 128 153]...]
但我得到了这个:
// [[226 129 128] [226 129 128] [226] [226 129 128] [226] [226] [226] [226] [226] [226] [226 129 128]...]
我不明白为什么。帮助和解释将不胜感激。
答案 0 :(得分:3)
切片是一个带有指向底层数组,长度和容量的指针的结构。
type slice struct {
array unsafe.Pointer
len int
cap int
}
在附加切片结构后,您正在更改基础数组。 ia.Next()
重用其返回缓冲区。
例如,
package main
import (
"fmt"
"golang.org/x/text/unicode/norm"
)
func Normalizer(s string) (ss [][]byte) {
ss = make([][]byte, 0)
var ia norm.Iter
ia.InitString(norm.NFC, s)
for !ia.Done() {
next := ia.Next()
fmt.Println(string(next), &next[0])
ss = append(ss, next)
}
fmt.Println()
for i := range ss {
fmt.Println(string(ss[i]), &ss[i][0])
}
fmt.Println()
return
}
func main() {
ss := Normalizer("abc")
fmt.Printf("%s\n", ss)
}
输出:
a 0xc420092228
b 0xc420092228
c 0xc420092228
c 0xc420092228
c 0xc420092228
c 0xc420092228
[c c c]
替换切片结构的副本
next := ia.Next()
使用带有新底层数组的新切片结构
next := append([]byte(nil), ia.Next()...)
例如,
package main
import (
"fmt"
"golang.org/x/text/unicode/norm"
)
func Normalizer(s string) (ss [][]byte) {
ss = make([][]byte, 0)
var ia norm.Iter
ia.InitString(norm.NFC, s)
for !ia.Done() {
next := append([]byte(nil), ia.Next()...)
fmt.Println(string(next), &next[0])
ss = append(ss, next)
}
fmt.Println()
for i := range ss {
fmt.Println(string(ss[i]), &ss[i][0])
}
fmt.Println()
return
}
func main() {
ss := Normalizer("abc")
fmt.Printf("%s\n", ss)
}
输出:
a 0xc4200120d0
b 0xc4200120e8
c 0xc420012108
a 0xc4200120d0
b 0xc4200120e8
c 0xc420012108
[a b c]
参考文献: