前言

如果说最纯粹的面向对象语言,我觉得是Java无疑。而且Java语言的面向对象也是很直观,很容易理解的。class是基础,其他都是要写在class里的。


提示:以下是本篇文章正文内容,下面案例可供参考

一、?

Golang没有类(class)。

Golang中并没有明确的面向对象的说法,不能算是一种面向对象的语言。因为:

  1. Golang只支持封装,不支持继承和多态

  2. Golang只有struct,没有class

  3. Golang并没有构造函数和析构函数的概念,这和Go语言的内存回收机制有关系。

    对于析构函数,Go提供了defer的关键字,它只要在函数内部实现,等到函数运行结束时便会被自动调用。defer有点像析构函数,但是却不是,因为它的作用范围是函数级别。(后续会整理defer )

    当然Go也可以采取其他手段模拟构造函数和析构函数,不过笔者觉得最好不这么做,既然Go特意这么设计,就不希望如此实现。

实在要扯上的话,可以将struct比作其它语言中的class。

类声明

这样就声明了一个类,其中没有public、protected、private的的声明。

golang用另外一种做法来实现属性的访问权限:属性的开头字母是大写的则在其它包中可以被访问,否则只能在本包中访问。类的声明和方法亦是如此。

  func (r ReceiverType) funcName(parameters) (results)

类方法声明

或者

和其它语言不一样,golang声明方法和普通方法一致,只是在func后增加了poem Poem这样的声明。加和没有加*的区别在于一个是传递指针对象,一个是传递值对象。

二、编写People接口和结构体

代码如下(示例):

package main

import "fmt"

//接口定义:人的功能
type PeopleFer interface {
	//说
	Say()
	//讲中文
	SayChinese()
	//跑
	Run()
	//跳
	Jump()
}

// 结构体声明: 人
type People struct {
	Name      string "名字"
	Age       int    "年龄"
	Sex       string "性别"
	BloodType string "血型"
}

// 接受者 人,实现say      ( p *People 指针接收着 )
func (p *People) Say() {
	fmt.Printf("%v 可以说话 say \n", p.Name)
}

// 接受者 人,实现say   (  p People 值接收着 )
func (p People) SayChinese() {
	fmt.Printf("%v 可以说中文 say \n", p.Name)
}

// 接受者 人,实现Run
func (p *People) Run() {
	fmt.Printf("%v 可以跑 run\n", p.Name)
}

// 接受者 人,实现Jump
func (p *People) Jump() {
	fmt.Printf("%v 可以跳 jump\n", p.Name)
}

// 实现方法,参数 接口,返回接口
func Impl(x PeopleFer) PeopleFer {
	fmt.Print("Impl() 实现方法,参数 接口,返回接口 \n")
	return x
}

func main() {
	var zSan = People{"张三", 20, "男", "O型"}
	fmt.Println(zSan)
	//指针接收者
	var zSanImpl = Impl(&zSan)
	zSanImpl.Say()
	zSanImpl.Run()
	zSanImpl.Jump()
	//值接受者
	zSanImpl.SayChinese()

	fmt.Println("------------------------------------------------")

	zSan = People{"李四", 12, "女", "A型"}
	fmt.Println(zSan)
	zSanImpl = Impl(&zSan)
	zSanImpl.Say()
	zSanImpl.Run()
	zSanImpl.Jump()
	zSanImpl.SayChinese()
}

代码运行输出(如下):