go结构体中String接口的实现为什么是结构体而不是指针

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()
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值