1 类型系统
基础类型,如byte、int、bool、float等;
复合类型,如数组、结构体、指针等;
可以指向任意对象的类型(Any类型);
值语义和引用语义;
面向对象,即所有具备面向对象特征(比如成员方法)的类型;
接口
复合类型,如数组、结构体、指针等;
可以指向任意对象的类型(Any类型);
值语义和引用语义;
面向对象,即所有具备面向对象特征(比如成员方法)的类型;
接口
1.1 为类型添加方法
type Integer int
func (a Integer) Less(b Integer) bool {
return a < b
}
func (a Integer) Less(b Integer) bool {
return a < b
}
1.2 值语义和引用语义
Go语言中的大多数类型都基于值语义,包括:
基本类型,如byte、int、bool、float32、float64和string等;
复合类型,如数组(array)、结构体(struct)和指针(pointer)等。
Go语言中类型的值语义表现得非常彻底。我们之所以这么说,是因为数组。
基本类型,如byte、int、bool、float32、float64和string等;
复合类型,如数组(array)、结构体(struct)和指针(pointer)等。
Go语言中类型的值语义表现得非常彻底。我们之所以这么说,是因为数组。
Go语言中有4个类型比较特别,看起来像引用类型
数组切片:指向数组(array)的一个区间。
map:极其常见的数据结构,提供键值查询能力。
channel:执行体(goroutine)间的通信设施。
接口(interface):对一组满足某个契约的类型的抽象。
map:极其常见的数据结构,提供键值查询能力。
channel:执行体(goroutine)间的通信设施。
接口(interface):对一组满足某个契约的类型的抽象。
1.3 结构体
所有的Go语言类型(指针类型除外)都可以有自己的方法
rect2 := &Rect{}
rect3 := &Rect{0, 0, 100, 200}
rect4 := &Rect{width: 100, height: 200}
type Rect struct {
x, y float64
width, height float64
}
func (r *Rect) Area() float64 {
return r.width * r.height
}
2. 初始化
rect1 := new(Rect)rect2 := &Rect{}
rect3 := &Rect{0, 0, 100, 200}
rect4 := &Rect{width: 100, height: 200}
3. 匿名组合
type Base struct {
Name string
}
func (base *Base) Foo() { ... }
func (base *Base) Bar() { ... }
type Foo struct {
Base
...
}
func (foo *Foo) Bar() {
foo.Base.Bar()
...
}
在“派生类”Foo没有改写“基类”Base的成员方法时,相应的方法就被“继承”,例如在
上面的例子中,调用foo.Foo()和调用foo.Base.Foo()效果一致。
上面的例子中,调用foo.Foo()和调用foo.Base.Foo()效果一致。
4. 可见性
Go语言中符号的可访问性是包一级的而不是类型一级的
5. 接口
在Go语言中,只要两个接口拥有相同的方法列表(次序不同不要紧),那么它们就是等同的,可以相互赋值。
注意:接口查询、类型查询