Chinaunix首页 | 论坛 | 博客
  • 博客访问: 285826
  • 博文数量: 124
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 21
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-20 14:44
文章分类

全部博文(124)

文章存档

2020年(1)

2018年(2)

2016年(2)

2015年(6)

2014年(10)

2013年(23)

2012年(7)

2011年(18)

2010年(15)

2009年(8)

2007年(8)

2006年(23)

2005年(1)

我的朋友

分类: C/C++

2014-12-15 00:27:37

golang 中说明*T包含了T的方法,反之不成立;
例子如下:由于只有*abc实现了wanjm的change方法,所以只有*abc是wanjm的实现,而abc却不是。所以当19行试图传入参数a时,程序报错;应该写为test(&a,12);

点击(此处)折叠或打开

  1. package main
  2. type abc struct{
  3.     i int
  4. }
  5. type wanjm interface{
  6.     change(int);
  7. }

  8. func (this * abc) change(i int){
  9.     this.i=i;
  10. }

  11. func test(a wanjm,value int){
  12.     a.change(value);
  13. }

  14. func main(){
  15.     var a=abc{10}
  16.     test(a,12);
  17.     print(a.i);
  18. }
说明:
1. wanjm是一个interface,每一个实现change方法的都是wanjm对象;
2. test的第一个参数是wanjm,所以传入参数时,只要该对象实现了change,都可以传入;
3. *abc定义了change方法, 而abc没有实现. 所以19行只能传入&a; 否则编译出错;


点击(此处)折叠或打开

  1. package main

  2. type abc struct {
  3.     i int
  4. }
  5. type wanjm interface {
  6.     change(int)
  7. }

  8. func (this abc) change(i int) {
  9.     this.i = i
  10. }

  11. func test(a wanjm, value int) {
  12.     a.change(value)
  13. }

  14. func main() {
  15.     var a = abc{10}
  16.     test(a, 12)
  17.     print(a.i)
  18.     test(&a, 12)
  19.     print(a.i)
  20. }
1.当我们让abc实现change方法时, 20行,22行都可以调用了. *T自动包含了T的方法,但是输出都是10;因为这是参数传递,无法改变外面的变量;
2. func (this *abc) change(i int) {this.i = i} 我们添加这段代码, 试图给*abc也实现change方法,编译会报错. change方法被重复定义. 因为*abc自动包含abc方法,再明确定义一个,那就是两个了;


那要多到上面遇到的问题 让change能整整改变i的值, 该怎么办呢?代码如下:

点击(此处)折叠或打开

  1. package main

  2. type abc struct {
  3.     i int
  4. }
  5. type wanjm interface {
  6.     change(int)
  7. }

  8. func (this abc) change(i int) {
  9.     this.i = i
  10. }

  11. type nabc abc

  12. func (this *nabc) change(i int) {
  13.     this.i = i
  14. }

  15. func test(a wanjm, value int) {
  16.     a.change(value)
  17. }

  18. func main() {
  19.     var a = abc{10}
  20.     var b = nabc(a)
  21.     test(a, 12)
  22.     print(a.i, "\n") //10
  23.     test(&b, 13)
  24.     print(b.i, "\n") //12
  25.     print(a.i, "\n") //10

  26.     c := (*nabc)(unsafe.Pointer(&a))//通过该函数实现类型转换;
  27.     d:=*c; //内存复制;
  28.     test(c, 14)
  29.     print(a.i, "\n") //14
  30.     print(d.i,"\n") //10;
  31. }
1. 14行,重新定义了nabc类型;
2. 16行, *nabc重新定义change方法;
3.  26行:将a强行转化为nabc类型;
4. 可以执行了.
5. 从输出结果看b.i得到更新. 但是a.i没有得到更新;
6. 所以26行的强行转化实际是新生成了一个变量; a,b不是同一个内容, 这个很关键;
7. 33行可以达到调用*nabc置换内部值的效果,但是不知道有哪些不安全因素;



阅读(1115) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~