相对其他的编程语言,go的方法多一个(接受者 接收者类型)
func (e Employee) String() string{ return fmt.Sprintf("ID:%s-Nmae:%s-Age:%d",e.Id,e.Name,e.Age) } func (e *Employee) String() string{ return fmt.Sprintf("ID:%s/Name:%s/Age:%d", e.Id,e.Name,e.Age) }
其中第一种定义方式在实例对应方法被调用时,实例的对象会继续值的复制;而第二种则是为了避免内存拷贝。
同时因为第一种只传递了变量,所以不会改变自己的值,而第二种传递了指针,所以如果函数里做了 *** 作,自己的原值也会改变。同时go语言进行了一定的优化,用指针访问指向的结构体的字段时,可以不使用*。
func TestStr7uctOperations(t *testing.T){ e:=Employee{"0","Bob",20} //e:=&Employee{"0","Bob",20} fmt.Printf("Address is %xn", unsafe.Pointer(&e.Name)) t.Log(e.String) }
两种定义的方式返回的结果是一样的。
但是依旧有区别,如果输出传递的地址,两者则是不同的。考虑到指针的 *** 作省去了复制值的过程,为了节省空间可以考虑指针的方案。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)