go面向对象:
- 仅支持封装,不支持继承和多态。
- 没有class,只有struct
struct定义
type structName struct {
attributesName type
......
}
// Exapmle:
type treeNode struct {
value int
left, right *treeNode
}
var root treeNode
root = treeNode {value:1}
root.left = &treeNode{1, nil, nil}
root.left.left = new(treeNode) // java:root.left->left go .
不论是地址还是结构本身,一律使用”.”来访问
func createNode (value int) *treeNode {
return &treeNode{value:value} // 可以返回局部变量地址
}
var node = createNode(1)
struct方法
// struct方法
func (node treeNode) print() {
fmt.Println(node.value)
}
root.print()
// 一般的方法
func print(node treeNode) {
fmt.Println(node.value)
}
print(root)
func(node treeNode)
,仍然是值传递!
func (node treeNode) setValue(value int) {
node.value = value
}
func createNode (value int) *treeNode {
return &treeNode{value:value}
}
var node = createNode(0)
node.setValue(1)
node.print() // 0
setValue(value int)
需要成功修改value,可以修改为:
func (node *treeNode) setValue(value int) {
node.value = value
}
nil指针可以调用方法
值接收者or指针接收者
- 改变内容时使用指针接收者
- 结构体过大考虑指针接收者
- 一致性:如果有指针接收者,最好都是指针接收者
- 值接收者go特有
- 值/指针接收者均可接收值/指针