GO语言面向对象

当初开发go语言的时候就是因为C++的特性太过于繁杂,从而使得很多C++的开发者因为C++的特性而头疼,go语言成功的精简了C++的特性,使其很简洁,很少的特性,却可以完成很多的事情。

go语言中并没有像C++,Java语言中这类的Class,它只含有像C语言中的结构体,用结构体和指针等特性,完成一个类的作用,很巧妙的使用了指针和结构体,不仅是go的面向对象,包括go语言中的map等操作都是借助了结构体。其实,说白了,C++、Java等面向对象的语言中,类的底层实现就是结构体,对象的引用就是指针,只是语言把他们封装起来了而已。然而这使得很多人刚接触面向对象的时候很不理解这些东西。

下面,说所面向对象在go中的写法:

如果我们要再Java中定义一个Rect,可以求其面积,我们应该这么写

1 public class Rect {
2     public int x;
3     public int y;
4     public int Area() {
5         return x*y;
6     }
7 }

很简单,那么Go语言中怎么做呢?Go中并不存在所谓的类,所有的类都是用结构体表示的,所以要写一个类,我们先得定义一个结构体:

1 type Rect struct {
2     x, y int
3 }

这是一个Rect的结构体,那么一个类中,不仅要存在变量,还要有成员函数,那么go的成员函数是这么写的:

1 func (r *Rect) Area() int  {
2     return r.x*r.y
3 }

这个成员函数的功能是求面积的,显然,这个成员函数值对Rect的结构体适用,这样就实现了所谓的封装,那么,我们如何去创建并初始化类的实例呢

go语言提供了很多方式:

1 rect :=new(Rect)
2 rect :=&Rect{}
3 rect :=&Rect{1,2}
4 rect :=&Rect{x:3,y:4}

那么,一遍情况下,如果没有指定成员变量的大小,go语言会默认初始化成员变量为0,bool类型的为false。

那么,构造函数呢?

我们可以这么来写:

1 func NewRect(x,y int) *Rect {
2     return &Rect{x,y}
3 }

其实,这也是我们平时new一个对象时候的真正操作,只是go把他真正展现给我们了。

看到这里,我们似乎还有一个疑问,那就是,像java、C++中对于可见性的描述呢,go语言中不存在public等关键字,go语言中直接选择用字母大小写控制。

一个变量以大写字母开头则表示对其他包可见,如果想要不可见,那么使用小写字母即可,但是go语言中的可见性控制只是针对包的,并不针对类,也就是,同一个包下的类都是可见的。这个时候我们就可以知道了为什么输出语句是这样写的了吧:

1 fmt.Println("hello world")

因为此函数对其他包是可见的。

时间: 2025-01-26 04:21:16

GO语言面向对象的相关文章

c语言面向对象编程

#include <stdio.h> #include <stdlib.h> /*  *  *   1.  简单实现模拟虚函数表实现c语言面向对象的设计  *   2.  为实现:  函数注册调用  *   3.            通过文件实现函数注册调用  */ //封装 typedef struct _Shape Shape; //模拟虚函数表 struct ShapeClass {     void (*construct)(Shape* self); //构造函数   

Go语言开发(四)、Go语言面向对象

Go语言开发(四).Go语言面向对象 一.结构体和方法 1.结构体的定义 在结构体中可以为不同项定义不同的数据类型.结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.结构体定义需要使用type和struct语句.struct语句定义一个新的数据类型,结构体有中有一个或多个成员.type语句设定了结构体的名称.结构体的格式如下: type struct_variable_type struct { member definition; member definition; ... mem

C语言面向对象的简便方法

都知道C语言是面向过程的,但是现在软件规模越来越大,通过面向对象的方式可以简化开发.业余时间想了个简单的方法,在C中使用一部分面向对象的基本功能.由于C语言自身的限制,并不完善,只能将就用,聊胜于无,如果大家有好的想法可以一起讨论. 首先还是老规矩上代码: http://files.cnblogs.com/GhostZCH/object.rar 面向对象有三个基本属性:封装.继承和多态. 此处一一讲解处理方法. 1. 封装,基本思想就是用结构体代替类,属性没什么好说的,方法就麻烦点只能用函数指针

区块链技术语言(二十四)——Go语言面向对象:匿名组合

继承也是面向对象的三大基本特性之一.通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”.“父类”或“超类”.通过继承,不仅可以让某个类型的对象拥有属于自己的数据结构和操作,还会自动拥有父类的数据结构和操作.这使得现有的类在无需重新编写原来类的情况下对这些功能进行了扩展,很好地解决了代码的重用问题.继承机制的魅力和强大在于它允许程序员利用已经存在的类,并且可以以某种方式扩展这个类,而且对其他继承了这个父类属性和方法的对象没有影响.但Go语言没有继承这个概念,它通过匿名组合间接实现了

区块链技术语言(二十三)——Go语言面向对象:方法

封装是面向对象三大特性之一.封装的好处,一个是增加代码内聚性,就是将数据和对数据的操作封装在一起,提高可复用性和可维护性:还有就是信息隐藏,就是把不该暴露的信息藏起来,通过访问控制来隐藏数据,不被外界干扰.也就是说,一个对象就是一个封装了数据和操作这些数据的代码的逻辑实体.Go语言没有封装这个名词,但它通过方法实现了封装的特性. 一.Go语言方法 方法,本质上是一个函数.与普通函数的格式有一点不同,它在关键字 func 和方法名中间加入了一个特殊的接收器类型.其格式如下: 注: a. 接收者t的

go语言面向对象之方法

1.实现方法 package main import "fmt" //在面向对象编程中,一个对象其实就是一个简单的值或者一个变量,在这个 //对象中包含一些函数 //这种带有接受者的函数,我们称之为方法,本质上,一个方法 //则是一个和特殊类型关联的函数 //定义一个方法,实现两个数相加 type myint int //传统的定义方式,面向过程的方式定义函数 func Add(a,b myint) myint{ return a + b } //面向对象的方式定义方法,这个意思是Ad

(Object-C)学习笔记(二) --OC语言面向对象和基本概念

现在的高级编程语言大部分都是面向对象编程的. 那么什么是面向对象呢?我用我的见解举个例子:假设你正在用word编辑这么两件事 1.一个人走到桌子前面(1)拿起可乐(2)打开盖子(3)喝光(4)放下瓶子(5). 2.一个人走到桌子前面(1)拿起点心(2)吃了(3). 那么如果是用面向过程的方式来编程,第一件事是一个大括号,里面写着这5步.第二件事是一个大括号,里面写着3步.写这么两件事全部手写,不允许黏贴复制,一共8步. 如果使用面向对象的方式来编程,把这个过程分为了动作和物品,把这些步骤写出来但

PHP语言 -- 面向对象和面向过程的区别

例子:求阴影面积 面向过程 $r1 = 20; $r2 = 10; $mj = 3.14*$ri*$ri-3.14*$r2*$r2; echo $mj; 面向对象 class Yuan { private $r; function __construct($r) { $this->r = $r } function Mj() { return 3.14*$this->r*$this->r; } } $yuan1 = new Yuan(20); $yuan2 = new Yuan(10);

R语言面向对象编程:S3和R6

一.基于S3的面向对象编程 基于S3的面向对象编程是一种基于泛型函数(generic function)的实现方式. 1.S3函数的创建 S3对象组成:generic(generic FUN)+method(generic.class FUN) 泛型函数(generic)创建示例: get_n_elements <- function(x,...) { UseMethod("get_n_elements") } 通常用UseMethod()函数定义一个泛型函数的名称,通过传入参数