【发布时间】:2018-06-06 12:24:54
【问题描述】:
我正在使用 golang 编写一个示例程序,如下所示
package main
import (
"fmt"
)
type thing [2]byte
func walk(things []thing, idx int) []byte {
var match []byte
for i, thing := range things {
if i == idx {
match = thing[:]
}
}
return match
}
func main() {
ta := []thing{ thing{'W','A'}, thing{'O','R'} }
m := walk(ta, 0)
tb := []thing{ thing{'C','A'}, thing{'W','Y'}, thing{'N','V'} }
n := walk(tb, 1)
fmt.Printf("m = %s\n", m)
fmt.Printf("n = %s\n", n)
}
输出是:
m = OR
n = NV
我不知道为什么当 type thing [2]byte 是一个大小为 2 的数组而 ta 是 type []thing 时会出现这种情况。
现在,当您使用 [][]byte
编写与此相同的代码时package main
import (
"fmt"
)
func walk(things [][]byte, idx int) []byte {
var match []byte
for i, thing := range things {
if i == idx {
match = thing[:]
}
}
return match
}
func main() {
ta := [][]byte{[]byte{'W', 'A'}, []byte{'O', 'R'}}
m := walk(ta, 0)
tb := [][]byte{[]byte{'C', 'A'}, []byte{'W', 'Y'}, []byte{'N', 'V'}}
n := walk(tb, 1)
fmt.Printf("m = %s\n", m)
fmt.Printf("n = %s\n", n)
}
输出是
m = WA
n = WY
我对切片的这些不同行为感到困惑?
当ta is type thing []byte 和ta[:] when ta is [][]byte 相同时打印出ta[:]
【问题讨论】:
-
不一样——
thing是[2]byte类型,而不是[]byte类型。也就是说,它是一个array,而不是一个slice。语义不一样。 -
@manugup1 请允许我指出一些可能不正确的代码设计:如果你知道你有
[2]byte作为切片的元素,为什么在你的第一个例子中,正在返回 @ 987654334@?如果您返回[2]byte(一个数组),则该算法将按预期工作。你自己看看我想说什么:play.golang.org/p/wOGaJ9Pwtck。尽管如此,这是理解切片内部结构的一个很好的例子...... -
顺便说一句:这个例子直截了当:play.golang.org/p/GelDPKlNFO-
-
@manugulp1 昨天我在这里看到一条评论,感谢您提供有关实际问题的更多见解。你不应该像那样抹去 cmets,实际上它们通过给我积极的反馈并鼓励我继续贡献来帮助。别忘了这个地方毕竟是一个 CoP(实践社区)。
-
@Victor 我没有删除任何评论(至少不是故意的)!事实上,那条评论帮助我很好地理解了这个概念。我很惊讶它后来消失了。
标签: go