您的位置:首页 > 编程语言 > Go语言

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()
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  go
相关文章推荐