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

为什么通过方法对结构所做的更改不持久?

冉高寒
2023-03-14
问题内容

我试图了解为什么以下测试代码无法按预期工作:

package main

import (
    "fmt"
    "strings"
)

type Test struct {
    someStrings []string
}

func (this Test) AddString(s string) {
    this.someStrings = append(this.someStrings, s)
    this.Count() // will print "1"
}

func (this Test) Count() {
    fmt.Println(len(this.someStrings))
}

func main() {
    var test Test
    test.AddString("testing")
    test.Count() // will print "0"
}

这将打印:

"1"
"0"

意思someStrings是显然被修改了……然后就没有了。

有人知道这可能是什么问题吗?


问题答案:

AddString方法正在使用值(副本)接收器。修改是针对副本,而不是原始文档。必须使用指针接收器来改变原始实体:

package main

import (
        "fmt"
)

type Test struct {
        someStrings []string
}

func (t *Test) AddString(s string) {
        t.someStrings = append(t.someStrings, s)
        t.Count() // will print "1"
}

func (t Test) Count() {
        fmt.Println(len(t.someStrings))
}

func main() {
        var test Test
        test.AddString("testing")
        test.Count() // will print "0"
}

操场

输出量

1
1


 类似资料:
  • 问题内容: 这是我的第一篇文章,所以请对我“轻松”。:) …我对许多传统的编程语言非常熟悉,但是我是Go语言的新手,很难理解切片和范围的用法。下面的程序代码和注释说明了我的震惊。谢谢! 编写了自己的Mod函数,因为在Go库中找不到。 声明结构数组并添加一些记录 加载数据会产生我期望的输出 现在,我修改值并打印它们,以查看它们是否显示为已修改。这看起来像预期的那样。 现在,我只需再次遍历同一范围并打

  • 本文向大家介绍为什么jsonp不支持post的方法?相关面试题,主要包含被问及为什么jsonp不支持post的方法?时的应答技巧和注意事项,需要的朋友参考一下 jsonp是跨域解决方案的其中一种方式,依赖script来突破同源策略的限制,而script是通过get方式拉取资源的。 可参考我的文章中的jsonp的实现

  • 我尝试样式复选框背景颜色,但它不会改变任何我做。我正在使用最新的火狐29。 是否在css中或浏览器中有一些规则更改? CSS: 下面是一个演示http://jsfidle.net/6kxrg/

  • 问题内容: 我已经习惯了MSSQL,而不是Mysql,所以对这个可能很愚蠢的问题感到抱歉。我正在尝试通过运行以下查询来更新备份数据库的密码: 当我运行它时,它说 查询正常,受影响的0行(0.01秒)匹配的行:1已更改:0警告:0 为什么行匹配但没有变化? 问题答案: 这意味着该值未更改。由于该列已等于的md5哈希值,因此可能未更改。

  • 我被困在第2天:hackerrank上的操作员问题。任务如下:给定一顿饭的餐费(一顿饭的基本成本)、小费百分比(餐费的百分比作为小费添加)和税收百分比(餐费的百分比作为税收添加),查找并打印餐费的总成本。将结果四舍五入到最接近的整数。 这是我的代码: 截图

  • 问题内容: 当我看到以下代码无法按预期工作时,我有些困惑。 我认为Java总是通过引用将变量传递给函数。因此,为什么函数不能重新分配变量? 该程序输出。 问题答案: 对对象的引用是通过Java中的 值 传递的,因此在方法内部分配给局部变量不会更改原始变量。仅局部变量指向新字符串。稍微了解一下ASCII艺术可能会更容易理解。 最初,您有: 首次输入方法setNotNull时,您 将在中 获得null