在Go语言中, 你可以给任意类型(包括内置类型,但不包括指针类型)添加相应的办法。示例如下:

type Integer int

func (a Integer) Less(b Integer) bool{

return a < b

func main(){

var a Integer=1

if a.Less(2){

fmt.Println(a,"less than 2")

}

}

在代码中,我们为内置的int类型增加了一个新方法Less()。这样实现了后,就可以让整型像一个普通的类一样使用。对应的面向过程的方法如下:

func Integer_Less(a Integer, b Integer) bool {

return a<b

}

那么当我们需要修改对象的值的时候,就需要用到指针引用。调用如下:

func (a *Integer) Add(b Integer){

*a+=b

}

如果不传入指针,那么得到的值和传入的时候是一样的,这一点Go和C语言一样,类型都是基于值传递的。要想修改变量的值,只能传递指针。

既然类型都可以有自己的办法,那么对于结构体来说也一样可以拥有自己的方法。示例如下:

type Rect struct{

x,y float32

width,height float64

}

func (r Rect) Area() float64{

return r.width*r.height

}

func main(){

var r Rect

r.height=3

r.width=4

fmt.Println("the area is:",r.Area())

}

既然是面向对象,那么是否可以继承呢。答案是肯定的,Go里面也可以使用继承。但是和C++以及Java的方法不一样,采用了继承的方法。一般称为匿名组合。

type string1 struct{

first string

}

type string2 struct{

string1

second string

}

这个string1在string2的位置是灵活可变的,可以放在second的后面也可以放在前面。Go语言很清晰的告诉你类的内存布局是怎样的。此外,在Go语言中还可以随心所欲的修改内存布局。下面的代码定义了一个Base类并且实现了Foo和Bar两个方法。然后定义了一个Foo类,该类从Base类继承并改写了Bar方法。如果没有改写的话,那么相应的方法就被继承。例如foo.Foo就和foo.Base.Foo调用是一致的

type Base struct{

Name string

}

func(base *Base) Foo(){

}

func(base *Base) Bar(){

}

type Foo struct{

Base

}

func(foo *Foo) Bar(){

/*修改Bar实现*/

}

在c++和java中,对于继承都有很多关键字,比如private,public,protected. Go语言对关键字的增加非常谨慎。要是某个符号对其他包可见,需要将符号定义为以大写字母开头,否则无法访问。

package cal

type Garden struct{

x,y float32

}

func main(){

var g cal.Garden

g.x=1

}

在cal包内申明了Garden,并且有x和y两个变量。在引用的时候会提示如下错误:

src\test.go:62:3: g.x undefined (cannot refer to unexported field or method x)

提示找不到x。如果改成下面的形式则可以通过g.X=1来访问

type Garden struct{

X,Y float32

}

go语言之面向对象一的更多相关文章

  1. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  2. 第二十五节:Java语言基础-面向对象基础

    面向对象 面向过程的代表主要是C语言,面向对象是相对面向过程而言,Java是面向对象的编程语言,面向过程是通过函数体现,面向过程主要是功能行为. 而对于面向对象而言,将功能封装到对象,所以面向对象是基 ...

  3. 如何使用C语言的面向对象

    我们都知道,C++才是面向对象的语言,但是C语言是否能使用面向对象的功能? (1)继承性 typedef struct _parent { int data_parent; }Parent; type ...

  4. 比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?

    一门课的课后题答案,在这里备份一下: 面向对象程序设计语言 –  比较分析C++.Java.Python.R语言的面向对象特征,这些特征如何实现的?有什么相同点? C++ 语言的面向对象特征: 对象模 ...

  5. 用C语言实现面向对象的开发

    C语言的对象化模型 面向对象的特征主要包括: .封装,隐藏内部实现 .继承,复用现有代码 .多态,改写对象行为 采用C语言实现的关键是如何运用C语言本身的特性来实现上述面向对象的特征. 1.1 封装 ...

  6. 基于C语言的面向对象编程

    嵌入式软件开发中,虽然很多的开发工具已经支持C++的开发,但是因为有时考虑运行效率和编程习惯,还是有很多人喜欢用C来开发嵌入式软件.Miro Samek说:"我在开发现场发现,很多嵌入式软件 ...

  7. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

  8. luajit利用ffi结合C语言实现面向对象的封装库

    luajit中.利用ffi能够嵌入C.眼下luajit的最新版是2.0.4,在这之前的版本号我还不清楚这个扩展库详细怎么样,只是在2.04中,真的非常爽.  既然是嵌入C代码.那么要说让lua支持 ...

  9. go语言之面向对象

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

  10. C 语言实现面向对象编程

    转载 https://blog.csdn.net/onlyshi/article/details/81672279 C 语言实现面向对象编程1.引言面向对象编程(OOP)并不是一种特定的语言或者工具, ...

随机推荐

  1. mysql left join查询没走索引

    SELECT t0.ID as id, t0.`NAME` as name, t0.PHONE as phone, t0.`CITY_CODE` as cityCode, t0.SHOOTING_TI ...

  2. Tomcat Connector的三种不同的运行模式

    Tomcat Connector的三种不同的运行模式性能相差很大,有人测试过的结果如下: 这三种模式的不同之处如下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. Tomc ...

  3. Unity3D的脚本-script入门

    来自:http://blog.163.com/shininglore@126/blog/static/961841802013412101454833/ Unity3D的基本操作很容易就能掌握了,接下 ...

  4. nginx静态文件缓存

    open_file_cache max=65535 inactive=30s; open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间 open_file_cache_va ...

  5. MySQL 5.6.26几种安装包的差别

    http://downloads.mysql.com/archives/community/ 一.MySQL Installer 5.6.26 mysql-installer-community-5. ...

  6. Python——os.path.dirname(__file__) 与 os.path.join(str,str)

    Python os.path.dirname(__file__) Python os.path.join(str,str)   (1).当"print os.path.dirname(__f ...

  7. 小猪的Git使用总结

    小猪的Git使用总结 文件夹 小猪的Git使用总结 安装配置与文档 下载安装 文档教程相关 概念 Git的四个组成部分 文件的几个状态 Git与SVN版本号版本号控制存储差异 每次Commit时仓库中 ...

  8. php url路由伪静态

    RewriteEngine on RewriteBase /RewriteRule ^([a-zA-Z]{1,})/([a-zA-Z]{1,})$ webim2/operator/users.php? ...

  9. Paxos 学习总结

    近期学习了分布式领域的重要算法Paxos,这里罗列下关键点当作总结.自己水平有限,难免存在谬误,恳请读者指正.本篇不包含Paxos的基本理论介绍.Paxos基础能够參考以下的学习资料章节. 1 Pax ...

  10. 软件project--谈项目开发

    前段时间一直忙自考.着急赶项目进度,如今最终有时间回想这段时间的学习,突然发现自己已有半个月没有沉淀. 今天早上醒来.灵感如泉水般涌出,挡都挡不住.所以早上一到机房,便迫不及待的想大家分享灵感,希望大 ...