Go 語言僅支持封裝, 不支持繼承和多態(tài); 面向接口編程
Go 語言沒有 class, 只有 struct
結(jié)構(gòu)體和方法
結(jié)構(gòu)體定義
type TreeNode struct {
Left, Right *TreeNode
value int
}
結(jié)構(gòu)的創(chuàng)建
root := treeNode{value: 3}
root.left = &treeNode{}
root.right = &treeNode{5, nil, nil}
root.right.left = new(treeNode)
nodes := []treeNode {
{value: 3},
{},
{7, nil, &root},
}
fmt.Println(nodes)
- 無論地址還是結(jié)構(gòu)本身, 統(tǒng)一使用
.來訪問成員, 無構(gòu)造函數(shù)
手動 "構(gòu)造函數(shù)"
-
Go語言中是沒有構(gòu)造函數(shù)的, 可以通過工廠函數(shù)來手動"構(gòu)造函數(shù)"func createNode (value int ) *treeNode { return &treeNode{value:value} } root.left.right = createNode(2) // 輸出結(jié)果 &{2 <nil> <nil>} 注意返回了局部變量的地址
為結(jié)構(gòu)定義方法
-
顯示定義和命名的方法接收者 (值傳遞)
func (node treeNode) print() { fmt.Print(node.value) } -
使用指針作為方法的接收者; 只有使用指針才可以改變結(jié)構(gòu)內(nèi)容;
func (node *treeNode) setValue(value int) { node.value = value } nil指針也可以調(diào)用方法
值接收者 VS 指針接收者
- 要改變內(nèi)容必須使用指針接收者
- 結(jié)構(gòu)過大也考慮使用指針接收者
- 一致性: 如果有指針接收者, 最好都是使用指針接收者
包和封裝
封裝
- 名字一般使用駝峰命名法
CamelCase - 首字母大寫:
public - 首字母小寫:
private
包
- 每個目錄只能有一個包, 包名和目錄名可以不一樣
-
main包包含可執(zhí)行入口 - 為結(jié)構(gòu)定義的方法必須放在同一個包內(nèi)
- 可以是不同的文件
GOPATH 和目錄結(jié)構(gòu)
默認(rèn)目錄
~/go(unix, linux)%USERPROFILE\go(windows)- 官方推薦: 所有項(xiàng)目和第三方庫都放在同一個
GOPATH下 - 也可以將每個項(xiàng)目放在不同的
GOPATH
go get 獲取第三方庫
全球最大的交(gao)友(ji)平臺 GitHub 獲取三方庫,有時候會被墻; 需要我們設(shè)置代理(proxy), 才能更好的使用三方工具
設(shè)置代理
打開命令行
go env -w GOPROXY=https://goproxy.io,direct
下載包管理工具 gopm
-
命令行輸入, 等結(jié)果就可以了
go get -u github.com/gpmgo/gopm
-
測試
gopm -helpsuccess.png到這里
Go的包管理工具gopm就下載完成了, 具體操作擼文檔就可以了