Go面向对象编程1——面向对象编程

Go 语言的代码是以包结构来组织的,且如果标示符(变量名,函数名,自定义类型等)如果以大写字母开头那么这些标示符是可以导出的,可以在任何导入了定义该标示符的包的包中直接使用。Go 语言中的面向对象和 C++,Java 中的面向对象不同,因为 Go 语言不支持继承,Go 语言只支持组合。

自定义类型

Go 语言的中结构体 struct 与 C++、JAVA 中的类 class 相似,但 Go 放弃了传统面向对象的诸多特性,只保留了组合。

  • type typeName typeSpecification

其中,typeName 可以是一个包或者函数内唯一合法的 Go 标示符。typeSpecification 可以是任何内置的类型,一个接口或者是一个结构体。所谓结构体,它的字段是由其他类型或者接口组成。例如我们通过结构体定义了一下类型:

1
2
3
4
type ColorPoint struct {
color.Color // 匿名字段(嵌入)
x, y int // 具名字段(聚合)
}

以上代码我们通过结构体自定义了类型 ColorPoint,结构体中 color.Color 字段是 Color 包的类型 color,这个字段没有名字,所以被称为匿名的,也是嵌入字段。字段 xy 是有变量名的,所以被称为具名字段。假如我们创建了类型 ColorPoint 的一个值 point(通过语法:point := ColorPoint{} 创建),那么这些字段可以通过 point.Colorpoint.xpoint.y 访问。其他面向对象语言中的"类 (class)"、“对象 (object)”、"实例 (instance)"在 Go 语言中我们完全避开使用。相反的我们使用"类型 (type)“和其对应的"值”,其中自定义类型的值可以包含方法。

定义了结构体后如何创建并初始化一个对象实例呢?Go 语言支持以下几种方法进行实现:

1
2
3
4
5
6
7
8
9
10
//先定义一个结构体Man
type Man struct{
name string
age int
}
//对象创建与初始化
man := new(Man)
man := &Man{}
man := &Man{"Tom", 18}
man := &Man{name: "Tom", age: 18}

为了更加方便的创建对象,我们一般会使用一个全局函数来完成对象的创建,这和传统的“构造函数”类似。

1
2
3
func NewMan(name string, age int) *Man {
return &Man{name, age}
}

Go面向对象编程1——面向对象编程
https://hodlyounger.github.io/2023/10/27/B_Code/GO/Go简明手册/面向对象编程/面向对象编程/【Go简明手册】Go面向对象编程1——面向对象编程/
作者
mingming
发布于
2023年10月27日
许可协议