go语言学习(五)——面向对象编程

主要讲的是“类”和接口&和其他传统语言不一样的地方挺多的,断断续续看了好几天

下面是我的练习代码

// GoStudy0219 project main.go
/*
go语言学习——面向对象编程(1)
go中类型的值语义和引用语义
结构体(类)的定义和初始化
*/
package main

import (
	"fmt"
)

func main() {
	//几种“类”的初始化
	v1 := &character{"Tom", 100, 10, 100} //这样定义出来的v1实际上时“类”的地址

	v2 := new(character) //	等价于v4:=&character{}
	v2.name = "Judy"
	v2.hp = 50
	v2.magic = 150
	v2.attack = 30

	v3 := &character{name: "Jim", hp: 150} //注意是花括号
	v3.magic = 30
	v3.attack = 20

	fmt.Println(v1)
	fmt.Println(v2)
	fmt.Println(v3)
	fmt.Println("*********************")

	//使用类的函数
	v1.addHp(600)
	fmt.Println(v1)
	fmt.Println(v1.hpIsLessThan(*v2))
	fmt.Println(v2)
	fmt.Println("*********************")

	//其他类型
	var v5 Age = 100
	fmt.Println(v5)

	v5.add(10)
	fmt.Println(v5)

	v5.errorAdd(10)
	fmt.Println(v5)
	fmt.Println("*********************")

	//值语义和引用语义
	//基本数据类型int,float之类的时值语义
	//数组和切片是值语义
	//map,channel和interface是引用语义

}

type Age int

func (this *Age) add(target Age) {
	*this += target
}

func (this Age) errorAdd(target Age) {
	this += target
}

//结构体(与其他语言中的类地位相同)
type character struct {
	name   string
	hp     float32
	attack float32
	magic  float32
}

func (this character) hpIsLessThan(target character) bool { //this character 不会改变this
	target.attack = 66
	return this.hp < target.hp
}

func (this *character) addHp(value float32) { //this *character 会改变this
	this.hp += value
}

 

// GoStudy0223 project main.go
/*
go语言学习——面向对象编程(2)
匿名组合
可访问性
*/

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello World!")

	var stu *student = &student{1001, *&person{"Tom", 10, true}}
	fmt.Println(stu)
	stu.greet()           //匿名组合,能直接调用匿名的函数的方法
	fmt.Println(stu.name) //匿名组合能够直接调用匿名函数的属性
	stu.walk()            //多态重载的实现

	var tea *teacher = &teacher{55, "Judy", *&person{"Tom", 10, false}}
	fmt.Println(tea.name)
}

type person struct {
	name  string
	age   int
	isMan bool
}

func (this *person) greet() {
	fmt.Println("hello")
}

func (this *person) walk() {
	fmt.Println("walk slow")
}

type student struct {
	studentId int
	person    //匿名组合
}

func (this *student) walk() { //相当于多态重载,外部调用walk时不再执行匿名函数中的walk函数
	this.person.walk() //根据需求,实现了“基类”的函数,
	fmt.Println("walk quick")
}

type teacher struct {
	teacherId int
	name      string //person 里面的name相当于被隐藏了,外部调用teacher.name的时候,person里面的name并不会起作用
	person
}

/*
匿名组合相当于用类型名称(去掉包名部分)作为成员变量的名字,
因此,一个类型中如果同时有类似于person和xxx.person的时候可能会报错,因此要避免这种情况
*/

/*
首字母大写表示包外可访问,首字母小写,表示包外不能访问。
同一包内,不论首字母是大写还是小写都是能访问的
*/

 

// GoStudy0224 project main.go
/*
go语言学习——面向对象编程(3)
接口
*/
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello World!")

	var per = &Person{"Tom", 50}
	fmt.Println(per)

	//接口的赋值
	//用对象赋值
	var v1 IAdd = per //这里传入的实际上是类型的地址
	v1.Add(10)
	fmt.Println(per)
	//用接口赋值
	var v2 IPerson = per
	var v3 IWalk = v2 //函数“全”的接口可以像函数“少”的接口赋值;如果几个接口中函数相同,则这几个接口可以相互转换
	v3.Walk()

	if v4, ok := v2.(IRead); ok { //检测,接口v2能不能转换成IRead接口
		v4.Read()
	}

	if v5, ok := v2.(*Person); ok { //检测,接口v2指向的对象类型是不是Person
		fmt.Println(v5)
	}

	var v6 interface{} = per //interface{}是any类型,空接口
	switch v7 := v6.(type) { //检测接口指向对象的类型
	case int:
		fmt.Println(v7, "int")
	default:
		fmt.Println(v7, "other")
	}

	var v8 IPerson2 = per
	v8.Read()

}

type Person struct {
	name string
	age  int
}

func (this *Person) Add(value int) {
	this.age += value
}

func (this *Person) Walk() {
	fmt.Println("walk")
}

func (this *Person) Speak() {
	fmt.Println("speak")
}

func (this *Person) Read() {
	fmt.Println("read")
}

//定义接口
type IWalk interface {
	Walk() //定义接口函数,省略func关键字
}

type IRead interface {
	Read()
}

type ISpeak interface {
	Speak()
}

type IAdd interface {
	Add(value int)
}

type IPerson interface {
	Walk()
	Read()
	Speak()
}

type IPerson2 interface { //接口的组合,等同于上一个接口的写法
	ISpeak
	IRead
	IWalk
}

/*传统语言的接口是一种契约,使用接口的类必须实现接口的所有方法,不同命名空间下的同名接口也被视为两个不同的接口
eg. C# java等需要考虑定义什么接口,在哪个类里面实现接口
go语言中,并不需要考虑上面的问题
*/
时间: 2024-10-05 01:52:27

go语言学习(五)——面向对象编程的相关文章

Go语言学习(十一)面向对象编程-类型系统

1.类型系统介绍 对于面向对象编程的支持Go 语言设计得非常简洁而优雅.简洁之处在于,Go语言并没有沿 袭传统面向对象编程中的诸多概念,比如继承.虚函数.构造函数和析构函数.隐藏的 this 指 针等. 一个典型的类型系统通常包含如下基本内容: 基础类型,如 byte . int . bool . float 等: 复合类型,如数组.结构体.指针等: 可以指向任意对象的类型( Any 类型): 面向对象,即所有具备面向对象特征(比如成员方法)的类型: 接口. 因为Java语言自诞生以来被称为最纯

Go语言学习(十三)面向对象编程-继承

1.匿名组合 Go语言也提供了继承,但是采用了组合的方式,所以我们将其称为匿名组合: package main import "fmt" //定义基类 type Base struct { Name string } //基类相关的2个成员方法 func (base *Base) A() { fmt.Println("Base method A called...") } func (base *Base) B() { fmt.Println("Base

如何在C语言里实现“面向对象编程”

有人认为面向对象是C++/Java这种高级语言的专利,实际不是这样,面向对象作为一种设计方法,是不限制语言的.只能说,用C++/Java这种语法来实现面向对象会更容易.更自然一些. 在本节中,就展示如何在C语言中实现面向对象编程,这是一件吃力的工作.写这些的目的有两个: ① 更好的掌握C++中的class的概念.学习了本章,就知道C程序员的无耐,就知道为什么要发明一个class的概念.为什么要有成员函数等等. ② 为C程序员提供一个参考设计.由在存在某些场合,只允许用C语言来编程,不允许用C++

Python学习笔记——面向对象编程

接下来学习面向对象编程,基础的就不记录了,只记录一些Python特有的或者高级的特性. http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318645694388f1f10473d7f416e9291616be8367ab5000 1. 类的定义 定义类使用class关键字,后面紧跟类名(首字母大写),接着是从哪个类继承下来的(所有类最终会继承object). 通过类名加参

从0开始的Python学习014面向对象编程

 简介 到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程.还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程. 类和对象是面向对象编程的两个重要方面.对于类和对象的关系,举个例子就像学生和小明同学的关系一样.学生(类)是一个拥有共同属性的群体,小明同学(对象)是其中一个有自己特性的个体. 对于一个对象或类的变量被称为域,函数被称为类或对象的方法. 域有两种类型--属于每个对象或属于类本身,分别成为实例变量和类变量. 类使用cl

Python学习之==&gt;面向对象编程

一.面向对象与面向过程 面向对象与面向过程是两种不同的编程范式,范式指的是按照什么方式去编程.去实现一个功能.不同的编程范式本质上代表对各种不同类型的任务采取不同的解决问题的思路. 1.面向过程编程 角色是执行者,把一个项目按照一定的顺序,从头到尾一步步执行下去.这种思想好理解,但只要前面一个步骤变了,后面的步骤也要跟着变,维护起来比较麻烦. 2.面向对象编程 角色是指挥者,把一个项目分成一个个小的部分,每个部分负责一方面的功能,整个项目由这些部分组合而成一个整体.类似一个机关,分为各个职能部门

五.面向对象编程

1.面向过程与面向对象 1.1面向过程(Procedure Oriented 简称PO :像C语言): 面向过程注重过程的.当解决一个问题的时候,面向过程会把事情拆分成: 一个个函数和数据(用于方法的参数) .然后按照一定的顺序,执行完这些方法(每个方法看作一个个过程),等方法执行完了,事情就搞定了. 1.2面向对象(Object Oriented简称OO :像C++,JAVA等语言): 面向对象注重对象的.当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然

开始学习Python面向对象编程

之前粗浅地学习过C++,对于面向对象有些了解,现在通过Python仔细学习一下面向对象: 类 类使用 class 关键字创建.类的域和方法被列在一个缩进块中. class Person: pass #pass语句表示一个空类 p = Person() print(p) $ python simplestclass.py <__main__.Person object at 0x019F85F0>#我们已经在 __main__ 模块中有了一个 Person 类的实例 对象的方法 class Pe

cg语言学习&amp;&amp;阳春白雪GPU编程入门学习

虽然所知甚少,但康大的<GPU编程与Cg编程之阳春白雪下里巴人>确实带我入了shader的门,在里面我第一次清晰地知道了"语义"的意思,非常感谢. 入门shader,我觉得可以先读3本书:<GPU编程与Cg编程之阳春白雪下里巴人>=><cg教程>=><Real-Time Rendering 3rd>(在读,最近忙,搁下了),打下理论基础. 下面是<cg教程>的读书笔记. 1.基本cg函数 1)数学函数:abs,ac

python学习day11 面向对象编程 类和实例

class Student(object): #class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的.通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类. def __init__(self,name,score): #通过定义一个特殊的__init__方法,在创建实例的时候,就把类的name,score等属性绑上去,__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__