每当我将附加结构的地址检索到实现接口(interface)的结构 slice 中时,它的指针地址似乎发生了变化。
Playground :https://play.golang.org/p/MmAS6S5IqH
package main
import (
"fmt"
)
type Apple struct {
Rotter
Color string
}
func (a *Apple) GetColor() string {
return a.Color
}
type Shop struct {
Rotters []Rotter
}
type Rotter interface {
GetColor() string
}
func main() {
red_apple := &Apple{Color: "Red"}
fmt.Println(red_apple.GetColor())
fmt.Println(&red_apple)
grocer := &Shop{}
grocer.Rotters = append(grocer.Rotters, red_apple)
for _, fruit := range grocer.Rotters {
fmt.Println(fruit.GetColor())
fmt.Println(&fruit)
}
}
正如在结果中打印出来的那样,结构的地址确实发生了变化,但值保持不变。
根据我在网上的了解,当一个结构体实现一个接口(interface)时,有一些额外的内存数据与该结构体一起存储。 (我假设这是在改变我的地址)
为了回答我的问题,我能否以某种方式更改我的 slice 或结构以解决此问题,并希望不要沿着反射路径走下去。 “绕过”是指通过 slice 获取原始地址。
最佳答案
问题中的代码打印局部变量的地址red_apple和 fruit .它们是不同的变量,因此具有不同的地址。
添加到 slice 中的指针值与从 slice 中检索到的接口(interface)中的值相同。试试这个:
red_apple := &Apple{Color: "Red"}
fmt.Println(red_apple.GetColor())
fmt.Printf("%p\n", red_apple) // print the value in red_apple as a pointer
grocer := &Shop{}
grocer.Rotters = append(grocer.Rotters, red_apple)
for _, fruit := range grocer.Rotters {
fmt.Println(fruit.GetColor())
fmt.Printf("%p\n", fruit) // print the value in fruit as a pointer
fmt.Println(fruit == red_apple)
}
请注意,这不是打印问题。我用 %p此处格式化,因为 fmt.Println(red_apple) 的输出和 fmt.Println(fruit)打印 &{<nil> Red}而不是指针值。
关键是你应该打印添加到 slice 和从 slice 中检索的值,而不是局部变量的地址。
关于pointers - 转到指针 : Slice of interfaces changing pointer address,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43794091/
我正在使用Maruku,将Markdown(超集)转换为HTML,你知道我该怎么做才能从HTML转换为Markdown吗? 最佳答案 Google发现了一个名为reverse_markdown的ruby脚本.它似乎可以满足您的需求。 关于ruby-on-rails-我需要从HTML转到markdown,有什么建议吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/175162
>>a=5=>5>>b=a=>5>>b=4=>4>>a=>5如何将“b”设置为实际的“a”,以便在示例中,变量a也将变为4。谢谢。 最佳答案 classRefdefinitializeval@val=valendattr_accessor:valdefto_s@val.to_sendenda=Ref.new(4)b=aputsa#=>4putsb#=>4a.val=5putsa#=>5putsb#=>5当您执行b=a时,b指向与a相同的对象(它们具有相同的object_id).当你执行a=some_other_thing时,a将指向
有没有办法使用vim结束Rubyblock?例如moduleSomeModule#defsome_methodendend我想用一个命令从光标所在的位置移动到block的末尾,这可能吗?我读过thisdocumentation,但它似乎不适用于.rb文件,我在某些地方读到它只适用于C(虽然还没有尝试过)。提前致谢。 最佳答案 rubyforge好像有官方包对此有一些支持:TheRubyftpluginnowincludesRubyspecificimplementationsforthe[[,]],[],][,[m,]m,[M,an
我在使用ExhuberantCtags跳转到Rubybang方法时遇到问题。我已经搜索过其他有类似问题的人,但找不到任何东西。可以使用以下小型Ruby类显示该问题的示例:classHellodefstartmethod!enddefmethod#Blahenddefmethod!#Blahendend当ctags-R.在此文件上运行时,生成的tags文件包含以下两行,表明这两种方法都是在生成时发现的:methodtest.rb/^defmethod$/;"fclass:Hellomethod!test.rb/^defmethod!$/;"fclass:Hello但是,如果我将光标放
我对Ruby中的对象分配和指针有点困惑,编写了这段代码来测试我的假设。classFooattr_accessor:one,:twodefinitialize(one,two)@one=one@two=twoendendbar=Foo.new(1,2)beans=barputsbarputsbeansbeans.one=2putsbarputsbeansputsbeans.oneputsbar.one我曾假设,当我将bar分配给beans时,它会创建该对象的副本,并且修改一个不会影响另一个。唉,输出显示不是这样。^_^[jergason:~]$rubytest.rb####22我相信这些
我正在使用Gosugem进行一些图形编程。问题是,当我创建一个窗口时,我的鼠标指针被隐藏了。我可以猜到鼠标在某个时刻的位置,我可以凭直觉点击,但我的用户可能不会。如何显示指针? 最佳答案 如果你想使用系统光标你可以这样做classWindow查看libgosu的文档RubyGosurdocReference/Window 关于ruby-为什么Gosu隐藏我的鼠标指针?,我们在StackOverflow上找到一个类似的问题: https://stackoverf
更新:我想通了。Ctrl-F仅在未选择我正在搜索的方法时有效。游标只需要在方法名中。我刚升级到TextMate2。当我选择一个方法并使用Ctrl+F转到它的定义时,我得到:>FailurerunningJumptoMethodDefinition这是痕迹:/Users/ilikepie/Library/ApplicationSupport/TextMate/Managed/Bundles/RubyonRails.tmbundle/Support/lib/rails/text_mate.rb:54:in`method_missing':undefinedmethod`current_li
也许这是一个愚蠢的问题,但我是ruby的新手,我用谷歌搜索了一下,发现了这些:proc=Proc.new{|x|deal_with(x)}a_lambda=lambda{|a|putsa}但我想要这个:defforward_slash_to_back(string)...defback_slash_to_forward(string)...defadd_back_slash_for_post(string)......caseconversion_typewhen/bf/ithenproc=&back_slash_to_forwardwhen/fb/ithenproc=&forward
我正在使用vim进行ruby、php和perl开发。有快捷方式%可以从block(子例程/函数/方法/if)的开头跳转到结尾,反之亦然。对我来说,ruby中的do/end标记上的%不起作用。我如何用vim做到这一点? 最佳答案 matchitplugin允许匹配的不仅仅是括号和注释。可以找到ruby版本here. 关于ruby-如何使用Vim从do跳转到Rubyblock的末尾?,我们在StackOverflow上找到一个类似的问题: https://
我想在Ruby的数组中存储几个不同的方法。假设我想将type方法存储两次:[type,type]不在数组中存储两个type条目;它执行type两次,并将results存储在数组中。如何显式引用方法对象本身?(这只是我真正想要的简化版本。)编辑:转念一想,下面提出的解决方案通过传递方法名称避免了这个问题,这让我很困扰。你如何传递方法对象本身?例如,如果将[:type,:type]传递给具有替代类型解析的方法会怎样?如何传递类型方法对象本身? 最佳答案 如果你想存储一个方法而不是调用方法的结果或者只是你发送来调用它的消息,你需要在拥有对