zoukankan      html  css  js  c++  java
  • go语言面向对象编程之类型系统

    go语言类型系统

    类型系统,顾名思义是指一个语言的类型体系结构,一个典型的类型系统通常包含如下基本内容

    • 基础类型:如byte,int,bool,float等
    • 复合类型:如数组,指针,结构体
    • 可以指向任意类型的类型(Any类型)
    • 值语义和引用语义
    • 面向对象
    • 接口

    类型系统是描述这些内容在一个语言是如何关联的,Go语言中的大多数类型都是值语义,并且都可以包含对应的操作方法,在需要的时候,你可以给任何类型增加新的方法,而在实现某个接口的时候也不需要从该接口继承,只需要实现该接口的所有的方法即可。任何类型都可以被Any类型引用,Any类型就是空接口,即interface{},接下来我们对Go语言类型系统的特点做详细的讲解。

    给类型添加方法

    在Go语言中,你可以给任意类型(但是不包含指针类型)添加对应的方法,如下:

    package main
    
    import "fmt"
    
    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 2")
    	}
    }
    

    在上面的例子中,我们定义了一个新的类型Integer,他和int没有本质的区别,只是他为内置的int类型增加了Less方法

    在GO语言中,只有你需要修改对象的时候,才必须用指针,他不是go语言的约束,而是一个自然约束。举个例子

    func (a *Integer) Add(b Integer){
    	*a += b
    }
    

    这个例子中为Integer类型增加了Add方法,由于Add方法需要修改对象的值,所以需要用指针引用,如果实现Add方法的时候传入的不是指针而是值,如下:

    func (a Integer) Add(b Integer){
    	a += b
    }
    

    那么运行Add方法后,得到的仍然是a原来的值,就其原因,是因为Go语言是值传递的,要想修改变量的值,只能传递指针

    值语义和引用语义

    值语义和引用语义的差别在于赋值,比如下面的例子:

    b = a
    b.Modify()
    

    如果b的修改不会影响a的值,那么此类型属于值语义,如果会影响到a的值,那么此类型是引用语义。

    Go中大多数的类型都是基于值语义的,包含:

    • 基本类型:如byte,int float等
    • 复合类型: 如数组,结构体,指针等

    Go语言中值语义表现的非常的彻底,我们之所以这么说,是因为数组

    Go语言中的数组,和基本类型没有区别,是很u纳粹的值类型,例如:

    var a = [3]int{1,2,3}
    var b = a
    b[1]++
    fmt.Println(a,b)
    

    运行结果如下:

    [1 2 3] [1 3 3]
    

    这表明b = a的赋值语句是,数组a的完全复制,要想表达引用需要使用指针

    var a = [3]int{1,2,3}
    	var b = &a
    	b[1]++
    	fmt.Println(a,*b)
    

    结果如下:

    [1 3 3] [1 3 3]
    

    结构体

    go语言中的结构体和其他语言的class有同等的地位,但是go放弃了包括集成在内的大量面向对象的特性,之保留了组合这个最基本的特性。

    Go的结构提只是很普通的复合类型,例如我们要定义一个矩形

    type Rect struct{
    	x,y float
    	width,heigth float
    }
    

    我们还可以定义成员方法来计算矩形的面积

    func (r Rect) Area() float{
    	return a.width * a.heigth;
    }
    
  • 相关阅读:
    大工程(bzoj 3611)
    消耗战(bzoj 2286)
    Computer(hdu 2196)
    文件排版(codevs 1300)
    洛谷 P2015 二叉苹果树
    洛谷 P2014 选课
    洛谷 P1352 没有上司的舞会
    COGS 505. 城市
    洛谷 P1306 斐波那契公约数
    洛谷 P1962 斐波那契数列
  • 原文地址:https://www.cnblogs.com/senlinyang/p/10259807.html
Copyright © 2011-2022 走看看