首先宣告,golang不能算是一種物件導向的語言。因為:
golang只支援封裝,不支援繼承和多型
golang只有struct,沒有class
結構(struct)建立在堆上還是棧上?
cpp中,區域性變數分配在棧上,在外界也要使用的變數要分配到堆上,並且要手動釋放
j**a中,物件都分配在堆上,有對應的垃圾**機制
go中不需要知道分配在堆上還是棧上。比如返回了區域性變數的位址,那麼是分配在堆上,並有對應的垃圾**,這些都是編譯器自己識別並實現的
值接收者vs指標接收者
要改變內容必須使用指標接收者
結構過大也考慮使用指標接收者
一致性:如果有指標接收者,最好都是指標接收者
值接收者是go語言特有,值/指標接收者均可接受值/指標
封裝名字一般使用camelcase形式
首字母大寫:public
首字母小寫:private
首字母大小寫是針對包(package)來說的
包每個目錄乙個包
main包包含可執行入口,如果這個包裡有main函式,那麼這個目錄下只能有乙個main包
為結構定義的方法必須放在同乙個包內,可以是不同檔案
如何擴充系統型別或者別人的型別
定義別名(見**2.1)
使用組合(見**1.3)
11.1 tree/node.go:
1.2 tree/tr**ersal.go:
1.3 tree/entry/entry.go:
1.4 output:
22.1 queue/queue.go:
2.2 queue/entry/main.go:
2.3 output:
package tree
import (
"fmt"
)type node struct
// 定義結構體的方法,(node treenode)是接收者,表示print()方法是給treenode來用的
func (node node) print()
// 注意如果不是指標接收者,那麼是值傳遞,改變不了值
func (node *node) setvalue(value int)
node.value = value
}// 自定義工廠函式:相當於自己寫的建構函式。go沒有建構函式
func createnode(value int) *node // 可以返回區域性變數的位址
}package tree
// 前序遍歷
func (node *node) tr**erse()
node.left.tr**erse()
node.print()
node.right.tr**erse()
}package main
import (
"fmt"
"learngo/tree"
)// 擴充型別方法1:組合方式
type mytreenode struct
func (mynode *mytreenode) postorder()
left := mytreenode
right := mytreenode
left.postorder()
right.postorder()
mynode.node.print()
}func main() ,
{},, }
fmt.println(nodes)
var root tree.node
root = tree.node
root.left = &tree.node{}
root.right = &tree.node
root.right.left = new(tree.node)
root.left.right = tree.createnode(2)
fmt.println(root)
root.right.left.setvalue(4)
root.right.left.print()
// 值接收者傳位址也可以,自動取值出來使用
proot := &root
proot.print()
proot.setvalue(200)
proot.print()
// nil指標也可以呼叫方法
fmt.println("use nil ptr:")
var proot2 *tree.node
proot2.setvalue(200)
proot2 = &root
proot2.setvalue(300)
proot2.print()
fmt.println("pre tr**ersing:")
root.tr**erse()
fmt.println()
// 擴充型別方法1:組合方式
fmt.println("post tr**ersing:")
myroot := mytreenode
myroot.postorder()
fmt.println()
}[ ]43
200use nil ptr:
setting value to nil node. ignored.
300pre tr**ersing:02
3004
5post tr**ersing:20
45300package queue
// 擴充型別方法2:使用別名
type queue int
func (q *queue) push(v int)
func (q *queue) pop() int
func (q *queue) isempty() bool package main
import (
"fmt"
"learngo/queue"
)func main()
q.push(2)
q.push(3)
fmt.println(q.pop())
fmt.println(q.pop())
fmt.println(q.isempty())
fmt.println(q.pop())
fmt.println(q.isempty())
}12false
3true
golang 物件導向
method的語法如下 func r receivertype funcname parameters results 下面我們用最開始的例子用method來實現 package main import fmt math type rectangle struct type circle struc...
golang 物件導向
package main golang 物件導向 import fmt type相當於 c c 的 typedef拉 type myint int64 type person struct 繼承 匿名欄位person,相當於c c 的繼承拉,student就擁有了person所有的屬性拉,其實c c...
golang 物件導向
method的語法如下 func r receivertype funcname parameters results 下面我們用最開始的例子用method來實現 package main import fmt math type rectangle struct type circle struc...