Go的封装

go中的封装和java的不太一样,在go里面是没有java中的class,不过可以把struct看成一个类,封装可以简单地看作对struct的封装,如下

  1. type EnvelopeA struct {
  2. envelope string
  3. }
  4. type EnvelopeB struct {
  5. envelope string
  6. }

封装有一个最重要的优点,是阻止了外部调用方对对象内部的值任意地进行修改。因为对象内部变量只可以被同一个包内的函数修改,所以包的作者可以让这些函数确保对象内部的一些值的不变性。比如下面的Envelope类型允许调用方来增加paper变量的值,并且允许将这个值reset为``,但是不允许随便设置这个值(译注:因为压根就访问不到):

  1. type Envelope struct {
  2. paper string
  3. }
  4. func (c *Envelope) GetVal()string { return c.paper }
  5. func (c *Envelope) Join(s string) { c.paper=c.paper+s }
  6. func (c *Envelope) Reset() { c.paper = `` }