切片是对基础数组的引用。这是有道理的,似乎可以在内置/原始类型上使用,但是为什么不能在结构上使用呢?我假设即使我更新了一个struct字段,引用/地址也仍然相同。
package main
import "fmt"
type My struct {
Name string
}
func main() {
x := []int{1}
update2(x)
fmt.Println(x[0])
update(x)
fmt.Println(x[0])
my := My{Name: ""}
update3([]My{my})
// Why my[0].Name is not "many" ?
fmt.Println(my)
}
func update(x []int) {
x[0] = 999
return
}
func update2(x []int) {
x[0] = 1000
return
}
func update3(x []My) {
x[0].Name = "many"
return
}
需要说明的是:我知道我可以在两种情况下都使用指针。我只是对为什么不更新结构感兴趣(与int不同)。
调用时要做的update3
是传递一个包含值副本的新数组,并立即丢弃该数组。这与您使用基元不同,因为您保留了数组。
这里有两种方法。
1) 使用指针数组而不是值数组:
您可以这样定义update3
:
func update3(x []*My) {
x[0].Name = "many"
return
}
并使用
update3([]*My{&my})
2) 在数组中写(以与处理原语相同的方式)
arr := make([]My,1)
arr[0] = My{Name: ""}
update3(arr)
Rust的枚举是代数数据类型。据我所知,这似乎包含了struct是什么。struct有什么不同之处需要保留它?
问题内容: 看到这个游乐场:http : //play.golang.org/p/nWHmlw1W01 为什么两个函数的输出不同? 问题答案: 诚然,这有点古怪,但是有一个解释。 想象一个变量是由两个字段组成的结构:一个是类型,另一个是数据。(和)。实际上,它看起来就像Go运行时中的样子。 当您将nil slice传递给时,只会将其作为值传递,因此您的比较可简化为。 同时,调用会自动将您的变量包装
我只是在进行围棋之旅,我对指针和接口感到困惑。为什么这个Go代码不编译? 也就是说,如果是一个,为什么不是一个? 我收到的错误消息是:
这里的border-image-slice为什么设置为1,为什么不是4,或者其他值?
问题内容: 为什么会发生以下现象: 可执行示例 问题答案: 构建一个空切片,就像一个空数组一样,它是一个有效且有用的对象(在所有语言中,而不仅仅是在Go中)。 空切片还仍然指向基础数组,位置和容量,有时可以扩展: 另一方面,长度为负的切片不一致。它没有任何意义,因此被禁止。
问题内容: 另一个更新:已解决(请参阅评论和我自己的答案)。 更新:这就是我要解释的。 答:这是通过贝塞尔校正来解释的,而不是通过标准偏差公式的分母来解释的。我希望熊猫使用与numpy相同的约定。 有一个相关的讨论在这里,但他们的建议都不能工作。 我有许多不同餐厅的数据。这是我的数据框(想象不止一家餐厅,但效果只再现了一家): 问题:返回每个餐厅的价格均值。我想得到标准偏差。但是, 返回错误的值