在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. iOS项目开发实战——使用同步请求获取网页源码

    网络请求一般分为同步请求和异步请求,同步请求假设訪问时间过长,会造成界面卡死状态,用户体验不是非常好.可是请求速度较快的话,也能够考虑使用同步訪问.如今先来学习同步訪问. (1)在viewDidLoa ...

  2. storage事件 js页面间通信

    1.概述 https://developer.mozilla.org/en-US/docs/Web/Events/storage localStorage 或者sessionStorage存储的数据发 ...

  3. 51单片机 | 使用D/A转换器实现三角波发生器

    ———————————————————————————————————————————— D/A转换器 CS=0.ILE=1时,WR1信号有效时将数据总线上的信号写入8位输入锁存器 XFER=0时,W ...

  4. 使用lua扩展应用程序

    全局变量的操作 void lua_getglobal(lua_State * L ,const char * name) 此函数从lua中取出一个名为name的全局变量并将其压入栈中. 如当lua文件 ...

  5. jira报错,此域不支持您输入的日期

    jira报错,此域不支持您输入的日期 解决方法: 使用20117-1-1这样的格式输入,不要用选择日期.具体原因未知.

  6. asp.net core 系列之Response caching(1)

    这篇文章简单的讲解了response caching: 讲解了cache-control,及对其中的头和值的作用,及设置来控制response caching; 简单的罗列了其他的缓存技术:In-me ...

  7. jfreechart时序图 demo

    import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.io.FileNotFoundExce ...

  8. linux系统寻找僵尸进程

    1. 用top命令来查看服务器当前是否有僵尸进程. 2. 用ps和grep命令寻找僵尸进程 $ ps -A -ostat, pid, ppid, cmd | grep -e '^[Zz]' 命令解释: ...

  9. dynamic与var

    dynamic与var示例 var是一种语法省略写法,编译器会根据上下文推断出正确的类型. , , , , , , , }; foreach (var item in scores) { Consol ...

  10. selenium驱动Firefox跳转页慢慢慢的问题(待验证)

    转载至http://www.cnblogs.com/yicaifeitian/p/5198871.html 为了解决这个问题,我是查了很多资料,解决方案是百度出来的.抱歉,我忘记出处在哪了,代码如下: ...