go结构体中String接口的实现为什么是结构体而不是指针
2016-10-19 15:17
387 查看
package main //Go语言组合的思想很重,数据之间如果要传承 //需要将数组组合进来 //Go有指针的概念,但是并没有指针运算符 import ( "fmt" ) const ( ANIMAL_CAT = 0 ANIMAL_MOUSE = 1 ANIMAL_DOG = 2 ) //go语言的接口 type Animal interface { name() (string) setName(name string) setType(animalType int) getType()(int) } //猫 type Cat struct{ //名称 m_name string "名称_tag" //类型 m_type int "类型_tag" //种类 m_spec string "种类_tag_反射用" } //接收器使用 (struct_name * StructType)和 (struct_name StructType)不一样 //Go语言中默认全部传递的是拷贝 //在用法上优先考虑使用 (struct_name *StructType),避免传值 func (cat Cat) name()(string) { return cat.m_name } func (cat Cat) setName(name string) { cat.m_name = name } func (cat Cat) setType(ty int) { cat.m_type = ty } func (cat Cat) getType()(int) { return cat.m_type } func (cat Cat) getSpec()(string) { return cat.m_spec } func (cat Cat) show() { fmt.Printf(":=> name=%s type=%d spec=%s\n", cat.m_name, cat.m_type, cat.m_spec) } //func (cat Cat) init() { // cat.m_name = "Cat" // cat.m_type = ANIMAL_CAT //} //老虎(猫科) type Tiger struct { //结构体中不能直接使用结构对象,但是可以使用指针 //这样聚合一个Cat对象的指针,相当于就从Cat做了继承了 //Cat的数据有了,调用方法直接使用cat调用 //m_cat默认就是nil,所有的都会自动初始化 m_cat * Cat } func main() { //没有构造函数,可以构造结构体来进行初始化 cat := Cat{"Cat", ANIMAL_CAT, "Cat Spec"} cat.show() fmt.Printf("&cat=0x%X\n", &cat.m_name) //结构体赋值操作后,cat4和cat分别是两个对象 cat4 := cat cat4.show() fmt.Printf("&cat4=0x%X\n", &cat.m_name) //如果接受器采用的是 (struct_name StructType),则调用函数无法设置结构体的数据 //如果接收器采用的是(struct_name* StructType), 则没有问题 //GO语言中默认都是传值,不会传引用的,所以如果要修改值的话,请穿引用 cat4.setName("Cat1") cat4.setType(ANIMAL_DOG) cat4.show() cat.show() //使用new关键字来,分配一个对象,Go语言自动初始化未初始化的数据 //访问数据的时候,直接使用.而不是-> cat2 := new(Cat) cat2.m_name = "Mouse" cat2.m_spec = "Mouse Spec" cat2.m_type = ANIMAL_MOUSE cat2.show() fmt.Printf("&cat2=0x%X\n", cat2) //做赋值操作cat3和cat2是两个不一样的指针,但是指向同一个结构体对象 cat3 := cat2 fmt.Printf("&cat3=0x%X\n", cat3) cat3.m_name = "Mouse1" cat3.show() cat2.show() }
相关文章推荐
- Map的new为什么是Map map=new HashMap();而不是new Map();?因为map是个接口,而接口不能被实例化!HashMap是map接口的实现类!
- C++多态中的实现要用指针,而不是虚基类(接口)的对象
- C++多态中的实现要用指针,而不是虚基类(接口)的对象
- @Resource引用一个bean时,为什么要声明接口而不是实现类?
- Go学习笔记:接口实现与指针
- 为什么Controller层注入的是Service接口,而不是ServiceImpl实现类
- 风趣探讨:为什么需要一个接口,一个接口的实现类,而不是直接调用类里的方法
- 含有string成员的结构体变量,为什么不能初始化?
- 面向对象设计原则六 - 针对接口编程,而不是针对实现编程
- 关于Session(javax.servlet.HttpSession)持久化----为什么实体类需要实现序列化接口
- 为什么abstract类需要实现接口成员
- 自定义ToString(),实现IFormattable.ToString()及IFormatProvider接口
- JavaBean为什么实现Serializable(序列化)接口
- 针对接口编程,而不是针对实现编程
- 无法实现接口成员,因为它不是公共的——interface
- 面向对象设计原则六 - 针对接口编程,而不是针对实现编程
- [翻译]List为什么实现了那么多接口?
- Effective C# 原则19:选择定义和实现接口,而不是继承
- VS2005的类设计器(Class Designer)中,如果显示让类继承接口,而不是实现接口?
- 无法实现接口成员,因为它不是公共的-----------interface