Golang 物件導向 CSDN部落格

2022-09-23 18:57:10 字數 3178 閱讀 5160

首先宣告,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...