当前位置: 首页 > 面试题库 >

为什么slice [] struct与[] builtin的行为不同?

章宏恺
2023-03-14
问题内容

切片是对基础数组的引用。这是有道理的,似乎可以在内置/原始类型上使用,但是为什么不能在结构上使用呢?我假设即使我更新了一个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相同的约定。 有一个相关的讨论在这里,但他们的建议都不能工作。 我有许多不同餐厅的数据。这是我的数据框(想象不止一家餐厅,但效果只再现了一家): 问题:返回每个餐厅的价格均值。我想得到标准偏差。但是, 返回错误的值