go面向对象-初始化

Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继承在内的大量面向对象特性,只保留了组合(composition)这个最基础的特性。组合甚至不能算面向对象特性,因为在C语言这样的过程式编程语言中,也有结构体,也有组合。组合只是形成复合类型的基础。
上面我们说到,所有的Go语言类型(指针类型除外)都可以有自己的方法。在这个背景下,
Go语言的结构体只是很普通的复合类型,平淡无奇。例如,我们要定义一个矩形类型:

type Rect struct {
      x, y float64
      width, height float64
}

然后我们定义成员方法 Area() 来计算矩形的面积:

func (r *Rect) Area() float64 {
    return r.width * r.height
}

可以看出, Go语言中结构体的使用方式与C语言并没有明显不同。

初始化

在定义了 Rect 类型后,该如何创建并初始化 Rect 类型的对象实例呢?这可以通过如下几种方法实现:

rect1 := new(Rect)
rect2 := &Rect{}
rect3 := &Rect{0, 0, 100, 200}
rect4 := &Rect{width: 100, height: 200}

在Go语言中,未进行显式初始化的变量都会被初始化为该类型的零值,例如 bool 类型的零
值为 false , int 类型的零值为0, string 类型的零值为空字符串。

构造函数

在Go语言中没有构造函数的概念,对象的创建通常交由一个全局的创建函数来完成,以
NewXXX 来命名,表示“构造函数” :

func NewRect(x, y, width, height float64) *Rect {
      return &Rect{x, y, width, height}
}

这一切非常自然,开发者也不需要分析在使用了 new 之后到底背后发生了多少事情。在Go语言中,一切要发生的事情都直接可以看到。

你可能感兴趣的:(go面向对象-初始化)