go语言面向对象编程之类型系统(添加方法)

一.提前感受go语言的面向对象


1.入门案例:求两点间距离

main
(
   )
Point {
   X, Y float64
}
Distance(q, p Point) float64 {
   math.Hypot(q.X - p.X, q.Y - p.Y)
}
(this Point) Distance  (another Point) float64 {
   math.Hypot(this.X - another.X, this.Y - another.Y)
}
main() {
   point1 := Point{, }
   point2 := Point{, }
   fmt.Println(Distance(point1, point2))
   fmt.Println(point1.Distance(point2))
}
假设你是一个懂C++、java或者其他编程语言的人,咱们以大家比较熟悉java语言为例,
先说明类型系统是什么样的,其实在java这样的语言,存在两套完全独立的类型系统:一套
值类型系统,主要是基本类型,如byte,int,boolean,char double等,这些类型是基于值语
义;一套以Object类型为根的对象类型系统,这些类型可以定义为成员变量与成员方法,可
以有虚函数,基于引用语义,只允许使用new关键字在堆上开辟空间。java中的Any类型就是
整个对象类型系统的根--Object类型。
   相比之下,
2.go语言的类型系统

    类型系统是只一个语言的类型体系结构,正常情况下,一个典型的类型系统应该包含以
下基本内容:
    1).基础类型
    2).复合类型
    3).可以指向任意对象的类型(Any类型(如java里面的Object, go里面的interface{}))
    4).值语义和引用语义
    5).面向对象,即所有具备面向对象特征(比如成语方法)的类型
    6).接口
main
Integer int
Integer_Less(a Integer, b Integer) bool {
   a < b
}
(num Integer) Less (b Integer) bool {
   num < b
}
main()  {
   a Integer = a.Less() {
      fmt.Println(a, )
   }
   Integer_Less(, ) {
      fmt.Println()
   }
}
    正常来说,go语言面向对象最为直观,也无需额外内存消耗,如果要求对象以指针传递
的话会有额外开销,因为对象本身有时很小(比如4个字节),用指针传递并不划算。只有需要
修改值的时候,才会使用指针。
(a *Integer) Add (b Integer)  {
   *a += b }
添加方法完整案列:
main
Integer int
Integer_Less(a Integer, b Integer) bool {
   a < b
}

(num Integer) Less (b Integer) bool {
   num < b
}

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

(a Integer) AddOne (b Integer)  {
   a += b fmt.Println(a)
}

main()  {
   a Integer = a.Less() {
      fmt.Println(a, )
   }
   Integer_Less(, ) {
      fmt.Println()
   }
   fmt.Println(a.Add())
   a.AddOne()
}



0
453