GO語言的模塊化和面向?qū)ο?/h1>
大小:0.6 MB 人氣: 2017-09-28 需要積分:2
這是關于評論GO語言的第二部分,第一部分:,第三部分會在不日后在CSDN公眾號(ID:csdnnews)發(fā)布。
在第一部分里面就GO語言的簡單功能(特征)做了論述,如常用語法,基本類型等。本文將主要提及GO所支持的package(包)和面向?qū)ο蟆T谶@之前呢,還是建議讀者閱讀一下此書,照舊,歡迎各方高人點評和糾錯。
總的來說,我發(fā)現(xiàn)GO語言面向?qū)ο蟮恼Z法有點亂,一致性差、不明顯,所以對于大多數(shù)使用場合,個人更傾向于C++明顯的繼承層次結(jié)構(gòu)。
在這個部分的文章里面故意不提及系統(tǒng)構(gòu)建,分發(fā)或者配置等內(nèi)容。
Packages(包)
Go代碼是以軟件包的形式組織的,Java也有包的概念,二者很像,跟C++命名空間也有點類似。 在源文件的開頭聲明包的名稱:
package foo
當需要用到某個包時,用import方式導入:
package bar //定義了包名
import ( //告訴Go編譯器這個程序需要使用 foo、moo 包(的函數(shù),或其他元素)
“foo”
“moo”
)
func somefunc() {
foo.Yadda()
var a moo.Thing
。。.
}
包名稱應與文件的目錄名稱匹配。 這是import語句找到對應包的關鍵。一個目錄可允許有多個文件,這些文件都是同一個包的一部分。
package main不受以上規(guī)則約束。由于其唯一性,所以對應的目錄不需要命名為main。
結(jié)構(gòu)體
在Go語言中可以像C一樣聲明一個結(jié)構(gòu)體:
type Thing struct {
// Member fields.
// Notice the lack of the var keyword.
a int
B int // See below about symbol visibility
}
var foo Thing
foo.B = 3
var bar Thing = Thing{3}
var goo *Thing = new(Thing)
goo.B = 5
我習慣使用var關鍵字演示變量的實際類型,也可能會選擇較短的表達式 := 。
請注意,我們可以將其創(chuàng)建為一個值或一個指針(使用內(nèi)置的new()函數(shù)),與C或C ++不同,Go中的結(jié)構(gòu)體所占的實際內(nèi)存并不能確定是在堆還是棧上。 具體由編譯器決定,一般是根據(jù)內(nèi)存是否需要延續(xù)功能調(diào)用來分配。
以前,我們已經(jīng)看到內(nèi)置的make()函數(shù)用于實例化slices(切片)和maps(集合)。 make()僅適用于那些內(nèi)置類型。 對于自定義類型,可以使用new()函數(shù)。 我發(fā)現(xiàn)這個區(qū)別有點混亂,但是我一般不喜歡使用語言本身就可以實現(xiàn)的類型區(qū)別。 我喜歡C++標準庫如何在C++中實現(xiàn)方式,當往庫里面添加內(nèi)容時,語言本身幾乎沒有什么特別的支持。
Go類型通常具有“構(gòu)造函數(shù)”(而不是方法),應該調(diào)用該函數(shù)來正確實例化該類型,但是我認為沒有辦法強制執(zhí)行正確的初始化,就像C++或Java中的默認構(gòu)造函數(shù)。 例如:
type Thing struct {
a int
name string
。。.
}
func NewThing() *Thing {
// 100 is a suitable default value for a in this type:
f := Thing{100, nil}
return &f
}
// Notice that different “constructors” must have different names,
// because go doesn‘t have function or method overloading.
func NewThingWithName(name string) *Thing {
f := Thing{100, name}
return &f
}
Embedding Structs(嵌套結(jié)構(gòu)體)
可以匿名地將一個結(jié)構(gòu)體“嵌入”到其他結(jié)構(gòu)體中,如下所示:
type Person struct {
Name string
}
type Employee struct {
Person
Position string
}
var a Employee
a.Name = “bob”
a.Position = “builder”
這感覺有點像C ++和Java中的繼承,例如,可以這樣:
var e = new(Employee)
// Compilation error.
var p *Person = e
// This works instead.
// So if we thought of this as a cast (we probably shouldn’t),
// this would mean that we have to explicitly cast to the base class.
var p *Person = e.Person
// This works.
e.methodOnPerson()
// And this works.
// Name is a field in the contained Person struct.
e.Name = 2
// These work too, but the extra qualification is unnecessary.
e.Person.methodOnPerson()
Methods(方法)
Go語言中的結(jié)構(gòu)體可以有Methods(與結(jié)構(gòu)相關聯(lián)的函數(shù)),這點和C/Java語言的classes(類)很像 , 但在語法方面略有不同。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
GO語言的模塊化和面向?qū)ο笙螺d
相關電子資料下載
- golang語言的加密解密算法實現(xiàn) 41
- 解析Go語言的高級特性 56
- 微服務架構(gòu)組件分析,看這篇就夠了 285
- 基于Go語言的反彈Shell命令生成工具簡介 116
- 什么是K3s和K8s?K3s和K8s有什么區(qū)別? 538
- Go能取代Python成為開發(fā)者的首選語言嗎? 147
- Go語言中的整數(shù)類型 106
- Go語言常量的聲明 141
- Go語言變量的命名和聲明 191
- Go語言簡介和安裝方法 269