我只是在玩 Go 并且还没有一个很好的心理模型来确定何时通过值或引用传递结构。
这可能是一个非常愚蠢的问题,但我只是想尝试一下,看看我是否仍在处理同一个对象,或者我已经制作了它的副本(按值传递)。
有没有办法打印对象的指针(或内部 id,如果指针值被 gc 更改)?
package main
import ( "runtime" )
type Something struct {
number int
queue chan int
}
func gotest( s *Something, done chan bool ) {
println( "from gotest:")
println( &s )
for num := range s.queue {
println( num )
s.number = num
}
done <- true
}
func main() {
runtime.GOMAXPROCS(4)
s := new(Something)
println(&s)
s.queue = make(chan int)
done := make(chan bool)
go gotest(s, done)
s.queue <- 42
close(s.queue)
<- done
println(&s)
println(s.number)
}
0x4930d4
from gotest:
0x4974d8
42
0x4930d4
42
最佳答案
Go 函数参数按值传递。
首先,让我们丢弃示例中不相关的部分,以便我们可以轻松看到您只是按值传递参数。例如,
package main
import "fmt"
func byval(q *int) {
fmt.Printf("3. byval -- q %T: &q=%p q=&i=%p *q=i=%v\n", q, &q, q, *q)
*q = 4143
fmt.Printf("4. byval -- q %T: &q=%p q=&i=%p *q=i=%v\n", q, &q, q, *q)
q = nil
}
func main() {
i := int(42)
fmt.Printf("1. main -- i %T: &i=%p i=%v\n", i, &i, i)
p := &i
fmt.Printf("2. main -- p %T: &p=%p p=&i=%p *p=i=%v\n", p, &p, p, *p)
byval(p)
fmt.Printf("5. main -- p %T: &p=%p p=&i=%p *p=i=%v\n", p, &p, p, *p)
fmt.Printf("6. main -- i %T: &i=%p i=%v\n", i, &i, i)
}
1. main -- i int: &i=0xf840000040 i=42
2. main -- p *int: &p=0xf8400000f0 p=&i=0xf840000040 *p=i=42
3. byval -- q *int: &q=0xf8400000d8 q=&i=0xf840000040 *q=i=42
4. byval -- q *int: &q=0xf8400000d8 q=&i=0xf840000040 *q=i=4143
5. main -- p *int: &p=0xf8400000f0 p=&i=0xf840000040 *p=i=4143
6. main -- i int: &i=0xf840000040 i=4143
main 中, i 是内存位置 ( int ) &i 处的 0xf800000040 变量,其初始值 ( i ) 5 6791442,main是一个指向p变量在存储器位置(int)&p用一个值(0xf8000000f0 = p)&i其指向一个0xf800000040值(int = *p)i。42,main是一个函数调用,它在存储位置(byval(p))p的值(&i = 0xf800000040)在存储位置(&p)0xf8000000f0参数的byval分配给功能q参数&q。换句话说,为 0xf8000000d8 参数 byval 分配了内存,并将 q main 参数 byval 的值分配给它; p 和 p 的值最初相同,但变量 q 和 p 不同。q 中,使用指针 byval ( q ),它是指针 *int ( p ) 的副本,整数 *int ( 607x14 ) 407914 ( 607x14 ) 607914 的新值是 407914 设置为 407914。最后回来之前。指针 *q 设置为 i(零值),这对 4143 没有影响,因为 q 是副本。nil,p是一个指向q变量在存储器位置(main)p用一个值(int = &p)0xf8000000f0其指向一个新p值(&i = 0xf800000040)int。*p 中, i 是内存位置 ( 4143 ) main 处的 i 变量,最终值 ( int ) 5 67914&i 调用的参数的函数 0xf800000040 变量 i 与函数 4143 参数 main 不同。它们具有相同的名称,但是是具有不同作用域和内存位置的不同变量。函数参数 s 隐藏了函数调用参数 gotest 。这就是为什么在我的示例中,我将参数和参数变量分别命名为 gotest 和 s 以强调差异。s)s是的存储器位置的在功能p可变q被用作一个参数的函数调用&s地址,0x4930d4是所述存储器位置为函数s参数main地址。如果在函数 gotest(s, done) 的末尾设置参数 0x4974d8 ,则对 gotest 中的变量 s 没有影响; s = nil 中的 gotest 和 s 中的 main 是不同的内存位置。在类型方面,s 为 main , s 为 gotest , &s 为 **Something 。 s 是指向(内存位置地址) *Something 的指针,它是指向(内存位置地址)类型为 *s 的匿名变量的指针。就值而言, Something 、 &s 、 s 和 Something 。main.&s != gotest.&s 。使用 main.s == gotest.s 包,例如,fmt.Printf("%v %p %v\n", &s, s, *s)
关于go - 如何打印 Go 对象的指针值?指针值是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4938612/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%