golang struct结构体方法中的参数需要定义为指针类型
2013-10-12 15:20
274 查看
前几日写一个网页的简单计数器问题时发现,计数器居然永远为0,计数器不计数,见鬼了。。。
代码如下:
研究一番,发现我们
应该改为
也就是说,对象的实例必须定义为指针的类型,然后才能传递正确的地址,否则ctr参数只是对象的一个副本,
于是修正代码为:
计数器终于计数了。。。
总结:golang隐式传递指针,但是不隐式定义指针,此坑需同学们注意。
代码如下:
type Counter struct { n int } func (ctr Counter) ServeHTTP(c http.ResponseWriter, req *http.Request){ fmt.Fprintf(c, "%08x\n", ctr) ctr.n++ fmt.Fprintf(c, "counter = %d\n", ctr.n) } func main() { http.Handle("/counter", new(Counter)) log.Fatal("ListenAndServe: ", http.ListenAndServe(":80", nil)) }
研究一番,发现我们
func (ctr Counter) ServeHTTP(c http.ResponseWriter, req *http.Request)
应该改为
func (ctr* Counter) ServeHTTP(c http.ResponseWriter, req *http.Request)
也就是说,对象的实例必须定义为指针的类型,然后才能传递正确的地址,否则ctr参数只是对象的一个副本,
于是修正代码为:
type Counter struct { n int } func (ctr *Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) { fmt.Fprintf(c, "%08x\n", ctr) ctr.n++ fmt.Fprintf(c, "counter = %d\n", ctr.n) } func main() { http.Handle("/counter", new(Counter)) log.Fatal("ListenAndServe: ", http.ListenAndServe(":80", nil)) }
计数器终于计数了。。。
总结:golang隐式传递指针,但是不隐式定义指针,此坑需同学们注意。
相关文章推荐
- golang struct结构体方法中的参数需要定义为指针类型
- C语言学习6 :指针的定义,指针类型要合法,指针要初始化,指针做函数参数,数组和指针的通用性,指针+1所代表的空间,void * 指针,交换函数中的指针,数组和字符型指针区别,字符型指针的应用,使用指针完成字符操作函数
- C# 001 --- 正确的删除一个控件的事件函数 --- 解决错误: “A”不包含“B”的定义,并且找不到可接受类型为“A”的第一个参数的扩展方法“B”(是否缺少 using 指令或程序集引用?)
- 关于页面不包含"事件_Click"的定义 并且找不到可接受页面类型的第一个参数的扩展方法"事件_Click" 的解决方案
- C#定义泛型方法错误-类型“T”必须是引用类型才能用作泛型类型或方法“System.Data.Linq.Table<TEntity>”中的参数“TEntity”
- 定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容
- CS1061: “ASP.send_aspx”不包含“sender_TextChanged”的定义,并且找不到可接受类型为“ASP.send_aspx”的第一个参数的扩展方法“sender_Text
- Cannot refer to the non-final local variable user defined in an enclosing scope 内部类定义在方法内,方法定义的参数(形参)无法被内部类直接访问,需要用final定义
- 问题(怎样在dephi中引用.net中定义的类.方法参数,参数类型为XMLdocument?我要调用此方法并把实例花的xmldocument类型的变量作为参数给它。)
- 编译器错误消息: CS1061: “ASP.default_aspx”不包含“Button1_Click”的定义,并且找不到可接受类型为“ASP.default_aspx”的第一个参数的扩展方法“Bu
- 错误 78 “Web.NewsDetail”不包含“Label1”的定义,并且找不到可接受类型为“Web.NewsDetail”的第一个参数的扩展方法“Label1”(是否缺少 using 指令或程序
- Scala 中当方法不需要接受参数时可定义成两种类型的方法
- 求助!!!“测试.Form1”不包含“Form1_Load”的定义,并且找不到可接受类型为“测试.Form1”的第一个参数的扩展方法“Form1_Load”(是否缺少 using 指令或程序集引用?)
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
- C++建立单向链表链表头指针需要使用指针类型的引用参数?
- Java 定义一个参数类型一样,但个数不固定的方法
- “System.Collections.Generic.IEnumerable<decimal>”不包含“ToArray”的定义,并且找不到可接受类型为“System.Collections.Generic.IEnumerable<decimal>”的第一个参数的扩展方法“ToArray”
- 错误 X “X1”不包含“XX2”的定义,并且找不到可接受类型为“X1”的第一个参数的扩展方法“XX2”(是否缺少 using 指令或程序集引用?)
- More Effective C# Item6 : 使用委托定义类型参数上的方法约束
- ASP.login_aspx”不包含“Button1_Click”的定义,并且找不到可接受类型为“ASP.login_aspx”的第一个参数的扩展方法“Button1_Click”(是否缺少 using 指令或程序集引用?)