把存货赶忙更新一波(捂脸)golang
1. 类型系统shell
类型系统,就是说一种编程语言怎么设计的它的类型的体系结构。编程
好比基础类型啊,复合类型啊,一些能够指向任意对象的类型啊,以及类型的语义,面向对象的特性,接口,这些内容。编程语言
2. 类型的方法函数
在Golang里,能够给任意类型添加方法。this
好比:spa
type Integer int func (i Integer)Less (b Integer) bool { return a<b }
Integer与int没有本质的不一样。咱们声明了一个属于Integer的函数Less()。这样咱们就能够把整型看成普通的类来使用:设计
func main() { var a Integer = 1 if a.Less(2) { fmt.Println(a, "Less 2") } }
那么类型的方法究竟是什么呢?咱们把刚才的Less()和下面的方法作个对比:指针
func NewLess(a Integer, b Integer) bool { return a<b }
这里,我刻意没有把a和b写在一块儿。对比刚才的Less()方法,咱们发现,所谓的类型方法,关键在于隐藏的this指针。若是咱们把类型a放到传递参数的部分,咱们就发现这两个函数并无区别。code
若是咱们须要在类型方法中对类型的实例自己进行修改,那么在声明的时候,就须要声明成指针。这也很好理解,就跟传递参数的时候传递指针是同样的道理。
func (i *Integer)Less (b Integer) bool { return a<b }
关于成员函数,再加一个例子
type T struct { num int } func (t T) add1() { t.num += 5 } func (t *T) add2() { t.num += 5 } func main() { t1 := T{5} t2 := &T{5} fmt.Println(t1) fmt.Println(t2) t1.add1() fmt.Println(t1.num) t1.add2() fmt.Println(t1.num) t2.add1() fmt.Println(t2.num) t2.add2() fmt.Println(t2.num) }
其结果以下:
shell> go run main.go {5} &{5} 5 10 5 10
3. 值语义和引用语义
值语义和引用语义的区别主要在于赋值。
b = a
b.Modify()
若是此时a没有变化,就是值类型,反之是引用类型。
Golang中大部分类型都是值类型。
因此只要记住引用类型便可。他们是切片,map,channel和接口。
4. 结构体和结构体的初始化
结构体struct跟其余语言的struct和class差很少。不过golang没有传统意义上的继承。
type Rect struct { x, y float64 width, height float64 }
struct的实例的初始化方法以下:
rect1 := new(Rect) rect2 := Rect{} rect3 := Rect{0, 0, 100, 200} rect4 := Rect{width: 100, height: 200}
须要注意的是,没有显式初始化的成员都会初始化为该类型的0值。
另外golang中没有构造函数的概念。若是须要相似的构造函数,一般是建立一个全局函数进行新对象的建立。
5. 结构体的组合
前面提到golang并无传统意义上的继承,可是,golang提供了组合。
type Base struct { Name string } func (base *Base) Foo() {...} func (base *Base) Bar() {...} type Foo struct { Base ... } func (foo *Foo) Bar() { foo.Base.Bar() ... }
能够看到,上面的代码定义了一个Base类,实现了Foo()和Bar()两个方法。而后定义了一个Foo类,该类中组合了Base类。
从形式了,Foo类“继承”了Base类,并改写了Bar()方法,同时在Bar()方法中调用了Base基类中的Bar()方法。
对于没有被改写的方法,就至关因而被“继承”了,同时仍然能够经过组合的类型来访问方法。好比,foo.Foo()和foo.Base.Foo()的效果是一致的。
6. 可见性
跟前面提到的相同,golang使用首字母大小写区别public和private。
7. 接口
Golang中的接口是非入侵式的。一个类只要实现了接口要求的全部函数,这个类就实现了该接口。
未完待续