Golang struct 面向对象编程 概念

面向对象其中一个很重要的特性就是继承,在go语言里面是不支持继承的,

封装数据和行为


第一种初始化,分别将每个filed的值放在这。第二种和第一种类似,指给每个filed对应的值。第三种使用new关键字来创建指向实例的指针,然后给这些filed赋值。 

有两种方式去定义行为,一种是直接对类型定义行为,另外一种就是定义为类型的指针。 

 

在Golang里面没有类的概念,它是使用结构体的东西来替代这个类的概念。

//张老太养了2只猫猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,今年8岁,花色。

请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示张老太没有这只猫猫。

使用变量的处理这里会出现一个问题,如果猫多了会出现定义的很多变量,如果定义了猫其他的特性这些变量都需要变化,这样下去代码就无法写了。即使找到了这只猫也无法通过一个变量来将所有的属性和特征取出来。

如果使用数组来解决,那么不仅仅猫猫的属性类型不一样,那么数组就解决不了。

func main() {
	var cat1Name string = "小白"
	var cat1Age int = 3
	var cat1Color string = "白色"

	var cat2Name string = "小花"
	var cat2Age int = 100
	var cat2Color string = "花色"
}
	var catNames [2]string = [...]string{"小白","小花"}
	var catAges [2]int = [...]int{1,2}
	var catColors [2]string = [...]string{"白色","花色"}

可以看到使用变量还是数组也好,这都不利于数据的管理,因为猫猫有很多的属性,这些属性又属于同一个对象,这样分散不好管理数据。

同时还有猫猫有一些行为,比如可以写代码,这些都是无法体现出来的。这些数据有了,但是还是希望操作这些数据。或者还有一些方法想给猫猫使用这些怎么办?

1)使用变量或者数组来解决养猫的问题,不利于数据的管理和维护。因为名字,年龄,颜色都是属于一只猫,但是这里是分开保存。

2)如果我们希望对一只猫的属性(名字、年龄,颜色)造行操作(绑定方法),也不好处理。

有多个属性属于一个变量这种情况,用单独变量和数组不好处理,就引出了结构体。

结构体


一个程序就是一个世界,有很多对象(对象就是变量) 

Golang语言面向对象编程说明

1)Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。

2)Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Golang是基于struct来实现OOP特性的。

3)Golang面向对象编程非常简洁,去掉了传统OOP语言的继承、方法重载、构造函数和析构函数、隐藏的this指针等等

4)Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:Golang没有extends关键字,继承是通过匿名字段来实现。

Golang面向对象(OOP)很优雅,OOP本身就是语言类型系统(type system)的一部分,通过接口(interface)关联,耦合性低,也非常灵活。后面同学们会充分体会到这个特点。也就是说在Golang中面向接口编程是非常重要的特性。

结构体与结构体变量(实例/对象)的关系示意图


对上图的说明:

1)将一类事物的特性提取出来(比如猫类)形成一个新的数据类型,就是一个结构体。

2)通过这个结构体,我们可以创建多个变量(实例对象)

3)事物可以猫类,也可以是Person,Fish或是某个工具类。

当声明创建一个结构体变量的时候,其实它的空间就已经分配了,只不过没有赋值而已。结构体可以将猫的信息全部统一管理,不仅仅可以统一管理还可以给猫绑定方法。 

type Cat struct {
	Name  string
	Age   int
	Color string
}

func main() {
	var cat1 Cat
	fmt.Println(cat1.Name, cat1.Age, cat1.Color)
	cat1.Name = "lucas"
	cat1.Age = 20
	cat1.Color = "red"
	fmt.Println(cat1.Name, cat1.Age, cat1.Color)
}

通过上面的案例和讲解我们可以看出:

1)结构体是自定义的数据类型,代表一类事物

2)结构体变量(实例)是具体的,实际的,代表一个具体变量

当声明结构体变量的时候,那么数据空间已经有了。在没有赋值的情况下,每种数据类型都会赋予其默认值,结构体变量是值类型的。

type student struct {
	a int
	b string
	c *string
}

func main() {
	var s student
	fmt.Printf("%#v", s)
}

main.student{a:0, b:"", c:(*string)(nil)}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值