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

为结构类型使用setter无法正常工作

别帅
2023-03-14
问题内容

对结构使用setter函数,但未按预期工作:

package main

import "fmt"

type T struct { Val string }

// this setter seems not to work
func (t T) SetVal( s string ) {
        t.Val = s
}

// this setter, using ptr to T, seems to work ok
func (t *T) SetVal2( s string ) {
        (*t).Val = s
}

func main() {
        v := T{"abc"}
        fmt.Println( v )        // prints {abc}
        v.SetVal("pdq")
        fmt.Println( v )        // prints {abc}, was expecting {pdq}!
        v.SetVal2("xyz")
        fmt.Println( v )        // prints {xyz}!
}

我缺少一些基本的知识-为什么不起作用SetVal

行为类似于设置值reflect,只有在提供指向对象的指针(相对于对象本身)时,该值才起作用


问题答案:

这是您缺少的基本理解:将结构作为指针传递给函数时,该函数可以修改原始结构,因为它具有指向它的指针。但是,当通过结构的值将结构传递给函数时,实际上只是为该函数调用创建了该结构的NEW副本,并且对该结构的新副本进行的任何修改都不会影响原始结构。

您可以通过打印出相关结构的实际地址来证明这是它的工作方式:

package main

import "fmt"

type T struct { Val string }

func (t T) SetVal( s string ) {
        fmt.Printf("Address of copy is %p\n", &t);
}

func (t *T) SetVal2( s string ) {
        fmt.Printf("Pointer argument is %p\n", t);
}

func main() {
        v := T{"abc"}
        fmt.Printf("Address of v is %p\n", &v);
        v.SetVal("pdq")
        v.SetVal2("xyz")
}

当我在Go操场上运行时,上面的代码将产生以下输出:

Address of v is 0xf840001290
Address of copy is 0xf8400013e0
Pointer argument is 0xf840001290

注意打印出来的第一个和第三个指针如何相等,这意味着它们是相同的结构。但是第二个指针是不同的,因为它是一个副本。

顺便说一句,这似乎与C结构/函数参数的工作方式完全相同。



 类似资料:
  • 根据https://developers.facebook.com/docs/messenger-platform/send-api-reference/video-attachment我应该可以通过信使发送视频。理想情况下,我想发送带有开始和结束时间的youtube视频,但这似乎行不通。 我目前正试图让它以任何这样的方式工作,所以我目前在FB上有视频,甚至那是不工作的。 python代码 201

  • 我下面的教程视频链接在这里:http://www.youtube.com/watch?v=wAwQ-noyB98 我安装了Matplotlib,包括其他必要的库:Numpy、dateutil、pytz、pyparsing和六个。 现在,我正在尝试以下命令: 导入matplotlib.pyplot plt。图([1,2,3,4,5,6,7],[5,6,7,8,9,10,11]) 我期待着某种图形出现

  • 问题内容: 我使用的字体库字体很棒。当项目没有用grunt构建/丑化时,它可以工作。 但是,当我用粗鲁的方式构建项目时,它不起作用。我在控制台中收到此错误:… / fonts / fontawesome-webfont.woff?v = 4.0.3 404(未找到) 我已经将这个项目与约曼搭在一起。 这是我在index.html中的引用 有什么想法可能是错误的吗? 更新 我需要将文件夹/ bowe

  • 问题内容: 我想在“ div”中显示txt文件的内容,所以我用按钮调用函数,但是即使我不按按钮,函数也会触发,这是我的HTML代码: 和我的js代码: 问题答案: 的第二个参数应该是一个函数。您没有传递函数,而是立即调用该函数并传递结果。改成:

  • 来自Mongo Shell 工作并将记录打印到屏幕上。 从快递 我每次都得到空响应。我尝试过不使用ObjectId包装,但我仍然得到空值。mongoDB连接很好,因为我有一个成功返回所有消息。 我做错了什么?

  • 问题内容: 看来AngularJS的不起作用。它不适用于数字字符串。难道我做错了什么?我应该使用吗? 我需要一些东西来查看字符串是否是一个数字(实际上是一个数字),除非我乘以1,否则我不会这么做,但是如果我这样做,那么它将始终为真。另外是不是一个数字(定义)等应该返回false。 问题答案: 在 JavaScript中 ,。 例如,如果需要将 字符串 识别为 Number ,则将其转换为 Numb