欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語言匿名字段區(qū)別 go語言匿名變量

沒有類,C語言有結構體,那么Go的結構體有什么特別之處?

Go語言中沒有“類”的概念,也不支持“類”的繼承等面向?qū)ο蟮母拍睢o語言中通過結構體的內(nèi)嵌再配合接口比面向?qū)ο缶哂懈叩臄U展性和靈活性。

創(chuàng)新互聯(lián)公司是專業(yè)的烈山網(wǎng)站建設公司,烈山接單;提供網(wǎng)站設計、網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行烈山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

自定義類型

在Go語言中有一些基本的數(shù)據(jù)類型,如string、整型、浮點型、布爾等數(shù)據(jù)類型, Go語言中可以使用type關鍵字來定義自定義類型。

自定義類型是定義了一個全新的類型。我們可以基于內(nèi)置的基本類型定義,也可以通過struct定義。例如:

通過Type關鍵字的定義,MyInt就是一種新的類型,它具有int的特性。

類型別名

類型別名是Go1.9版本添加的新功能。

類型別名規(guī)定:TypeAlias只是Type的別名,本質(zhì)上TypeAlias與Type是同一個類型。就像一個孩子小時候有小名、乳名,上學后用學名,英語老師又會給他起英文名,但這些名字都指的是他本人。

type TypeAlias = Type

我們之前見過的rune和byte就是類型別名,他們的定義如下:

類型定義和類型別名的區(qū)別

類型別名與類型定義表面上看只有一個等號的差異,我們通過下面的這段代碼來理解它們之間的區(qū)別。

結果顯示a的類型是main.NewInt,表示main包下定義的NewInt類型。b的類型是int。MyInt類型只會在代碼中存在,編譯完成時并不會有MyInt類型。

Go語言中的基礎數(shù)據(jù)類型可以表示一些事物的基本屬性,但是當我們想表達一個事物的全部或部分屬性時,這時候再用單一的基本數(shù)據(jù)類型明顯就無法滿足需求了,Go語言提供了一種自定義數(shù)據(jù)類型,可以封裝多個基本數(shù)據(jù)類型,這種數(shù)據(jù)類型叫結構體,英文名稱struct。 也就是我們可以通過struct來定義自己的類型了。

Go語言中通過struct來實現(xiàn)面向?qū)ο蟆?/p>

結構體的定義

使用type和struct關鍵字來定義結構體,具體代碼格式如下:

其中:

舉個例子,我們定義一個Person(人)結構體,代碼如下:

同樣類型的字段也可以寫在一行,

這樣我們就擁有了一個person的自定義類型,它有name、city、age三個字段,分別表示姓名、城市和年齡。這樣我們使用這個person結構體就能夠很方便的在程序中表示和存儲人信息了。

語言內(nèi)置的基礎數(shù)據(jù)類型是用來描述一個值的,而結構體是用來描述一組值的。比如一個人有名字、年齡和居住城市等,本質(zhì)上是一種聚合型的數(shù)據(jù)類型

結構體實例化

只有當結構體實例化時,才會真正地分配內(nèi)存。也就是必須實例化后才能使用結構體的字段。

基本實例化

舉個例子:

我們通過.來訪問結構體的字段(成員變量),例如p1.name和p1.age等。

匿名結構體

在定義一些臨時數(shù)據(jù)結構等場景下還可以使用匿名結構體。

創(chuàng)建指針類型結構體

我們還可以通過使用new關鍵字對結構體進行實例化,得到的是結構體的地址。 格式如下:

從打印的結果中我們可以看出p2是一個結構體指針。

需要注意的是在Go語言中支持對結構體指針直接使用.來訪問結構體的成員。

取結構體的地址實例化

使用對結構體進行取地址操作相當于對該結構體類型進行了一次new實例化操作。

p3.name = "七米"其實在底層是(*p3).name = "七米",這是Go語言幫我們實現(xiàn)的語法糖。

結構體初始化

沒有初始化的結構體,其成員變量都是對應其類型的零值。

使用鍵值對初始化

使用鍵值對對結構體進行初始化時,鍵對應結構體的字段,值對應該字段的初始值。

也可以對結構體指針進行鍵值對初始化,例如:

當某些字段沒有初始值的時候,該字段可以不寫。此時,沒有指定初始值的字段的值就是該字段類型的零值。

使用值的列表初始化

初始化結構體的時候可以簡寫,也就是初始化的時候不寫鍵,直接寫值:

使用這種格式初始化時,需要注意:

結構體內(nèi)存布局

結構體占用一塊連續(xù)的內(nèi)存。

輸出:

【進階知識點】關于Go語言中的內(nèi)存對齊推薦閱讀:在 Go 中恰到好處的內(nèi)存對齊

面試題

請問下面代碼的執(zhí)行結果是什么?

構造函數(shù)

Go語言的結構體沒有構造函數(shù),我們可以自己實現(xiàn)。 例如,下方的代碼就實現(xiàn)了一個person的構造函數(shù)。 因為struct是值類型,如果結構體比較復雜的話,值拷貝性能開銷會比較大,所以該構造函數(shù)返回的是結構體指針類型。

調(diào)用構造函數(shù)

方法和接收者

Go語言中的方法(Method)是一種作用于特定類型變量的函數(shù)。這種特定類型變量叫做接收者(Receiver)。接收者的概念就類似于其他語言中的this或者 self。

方法的定義格式如下:

其中,

舉個例子:

方法與函數(shù)的區(qū)別是,函數(shù)不屬于任何類型,方法屬于特定的類型。

指針類型的接收者

指針類型的接收者由一個結構體的指針組成,由于指針的特性,調(diào)用方法時修改接收者指針的任意成員變量,在方法結束后,修改都是有效的。這種方式就十分接近于其他語言中面向?qū)ο笾械膖his或者self。 例如我們?yōu)镻erson添加一個SetAge方法,來修改實例變量的年齡。

調(diào)用該方法:

值類型的接收者

當方法作用于值類型接收者時,Go語言會在代碼運行時將接收者的值復制一份。在值類型接收者的方法中可以獲取接收者的成員值,但修改操作只是針對副本,無法修改接收者變量本身。

什么時候應該使用指針類型接收者

任意類型添加方法

在Go語言中,接收者的類型可以是任何類型,不僅僅是結構體,任何類型都可以擁有方法。 舉個例子,我們基于內(nèi)置的int類型使用type關鍵字可以定義新的自定義類型,然后為我們的自定義類型添加方法。

注意事項: 非本地類型不能定義方法,也就是說我們不能給別的包的類型定義方法。

結構體的匿名字段

匿名字段默認采用類型名作為字段名,結構體要求字段名稱必須唯一,因此一個結構體中同種類型的匿名字段只能有一個。

嵌套結構體

一個結構體中可以嵌套包含另一個結構體或結構體指針。

嵌套匿名結構體

當訪問結構體成員時會先在結構體中查找該字段,找不到再去匿名結構體中查找。

嵌套結構體的字段名沖突

嵌套結構體內(nèi)部可能存在相同的字段名。這個時候為了避免歧義需要指定具體的內(nèi)嵌結構體的字段。

結構體的“繼承”

Go語言中使用結構體也可以實現(xiàn)其他編程語言中面向?qū)ο蟮睦^承。

結構體字段的可見性

結構體中字段大寫開頭表示可公開訪問,小寫表示私有(僅在定義當前結構體的包中可訪問)。

結構體與JSON序列化

JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時也易于機器解析和生成。JSON鍵值對是用來保存JS對象的一種方式,鍵/值對組合中的鍵名寫在前面并用雙引號""包裹,使用冒號:分隔,然后緊接著值;多個鍵值之間使用英文,分隔。

結構體標簽(Tag)

Tag是結構體的元信息,可以在運行的時候通過反射的機制讀取出來。 Tag在結構體字段的后方定義,由一對反引號包裹起來,具體的格式如下:

`key1:"value1" key2:"value2"`

結構體標簽由一個或多個鍵值對組成。鍵與值使用冒號分隔,值用雙引號括起來。鍵值對之間使用一個空格分隔。 注意事項: 為結構體編寫Tag時,必須嚴格遵守鍵值對的規(guī)則。結構體標簽的解析代碼的容錯能力很差,一旦格式寫錯,編譯和運行時都不會提示任何錯誤,通過反射也無法正確取值。例如不要在key和value之間添加空格。

例如我們?yōu)镾tudent結構體的每個字段定義json序列化時使用的Tag:

Go語言和其他語言的不同之基本語法

Go語言作為出現(xiàn)比較晚的一門編程語言,在其原生支持高并發(fā)、云原生等領域的優(yōu)秀表現(xiàn),像目前比較流行的容器編排技術Kubernetes、容器技術Docker都是用Go語言寫的,像Java等其他面向?qū)ο蟮恼Z言,雖然也能做云原生相關的開發(fā),但是支持的程度遠沒有Go語言高,憑借其語言特性和簡單的編程方式,彌補了其他編程語言一定程度上的不足,一度成為一個熱門的編程語言。

最近在學習Go語言,我之前使用過C#、Java等面向?qū)ο缶幊痰恼Z言,發(fā)現(xiàn)其中有很多的編程方式和其他語言有區(qū)別的地方,好記性不如爛筆頭,總結一下,和其他語言做個對比。這里只總結差異的地方,具體的語法不做詳細的介紹。

種一棵樹最好的時間是十年前,其次是現(xiàn)在。

3)變量初始化時候可以和其他語言一樣直接在變量后面加等號,等號后面為要初始化的值,也可以使用變量名:=變量值的簡單方式

3)變量賦值 Go語言的變量賦值和多數(shù)語言一致,但是Go語言提供了多重賦值的功能,比如下面這個交換i、j變量的語句:

在不支持多重賦值的語言中,交換兩個變量的值需要引入一個中間變量:

4)匿名變量

在使用其他語言時,有時候要獲取一個值,卻因為該函數(shù)返回多個值而不得不定義很多沒有的變量,Go語言可以借助多重返回值和匿名變量來避免這種寫法,使代碼看起來更優(yōu)雅。

假如GetName()函數(shù)返回3個值,分別是firstName,lastName和nickName

若指向獲得nickName,則函數(shù)調(diào)用可以這樣寫

這種寫法可以讓代碼更清晰,從而大幅降低溝通的復雜度和維護的難度。

1)基本常量

常量使用關鍵字const 定義,可以限定常量類型,但不是必須的,如果沒有定義常量的類型,是無類型常量

2)預定義常量

Go語言預定義了這些常量 true、false和iota

iota比較特殊,可以被任務是一個可被編譯器修改的常量,在每個const關鍵字出現(xiàn)時被重置為0,然后在下一個const出現(xiàn)之前每出現(xiàn)一個iota,其所代表的數(shù)字會自動加1.

3)枚舉

1)int 和int32在Go語言中被認為是兩種不同類型的類型

2)Go語言定義了兩個浮點型float32和float64,其中前者等價于C語言的float類型,后者等價于C語言的double類型

3)go語言支持復數(shù)類型

復數(shù)實際上是由兩個實數(shù)(在計算機中使用浮點數(shù)表示)構成,一個表示實部(real)、一個表示虛部(imag)。也就是數(shù)學上的那個復數(shù)

復數(shù)的表示

實部與虛部

對于一個復數(shù)z=complex(x,y),就可以通過Go語言內(nèi)置函數(shù)real(z)獲得該復數(shù)的實部,也就是x,通過imag(z)獲得該復數(shù)的虛部,也就是y

4)數(shù)組(值類型,長度在定義后無法再次修改,每次傳遞都將產(chǎn)生一個副本。)

5)數(shù)組切片(slice)

數(shù)組切片(slice)彌補了數(shù)組的不足,其數(shù)據(jù)結構可以抽象為以下三個變量:

6)Map 在go語言中Map不需要引入任何庫,使用很方便

Go循環(huán)語句只支持for關鍵字,不支持while和do-while

goto語句的語義非常簡單,就是跳轉到本函數(shù)內(nèi)的某個標簽

今天就介紹到這里,以后我會在總結Go語言在其他方面比如并發(fā)編程、面向?qū)ο蟆⒕W(wǎng)絡編程等方面的不同及使用方法。希望對大家有所幫助。

go中的struct

go和其他語言一樣,可以申明新的“結構體”,struct可以作為其他類型的屬性活字段的容器,定義方式如下:

type 關鍵字申明 person 為 struct 類型,person包含 name 屬性和 age 屬性,對應的類型為 string 和 int 。我們看看如何使用struct:

除了上面使用的方式使用 struct ,還有三種方式可以使用申明struct類型

完整是使用struct 例子

當我們創(chuàng)建結構體時,字段可以只有類型,而沒有字段名。這樣的字段稱為匿名字段(Anonymous Field)。習慣上匿名字段叫內(nèi)嵌,具名字段叫組合

上面我們申明了兩個結構體 Student 和 Person ,其中 Student 組合了 Person 字段,那么 Student 包含了 Person 中的所有字段

從上面的例子可以看出來,struct 不僅可以將struct作為匿名字段,自定義類型、內(nèi)置類型都可以作為匿名字段,也可以進行相應的函數(shù)操作。

這里我們有個問題,Person上有一個name屬性,如果Student上也有一個name屬性,那么我們怎么辦呢?其實在go里面,最外層的屬性具有有限的訪問權限,當你通過Student.name訪問的時候是訪問Student上的屬性。同理,我們可以通過Student.Person訪問Person上的屬性,如:

如果結構體的全部成員都是可以比較的,那么結構體也是可以比較的,那樣的話兩個結構體將可以使用 == 或 != 運算符進行比較,但不支持 或 。

當前標題:go語言匿名字段區(qū)別 go語言匿名變量
新聞來源:http://www.chinadenli.net/article2/dddssoc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護手機網(wǎng)站建設商城網(wǎng)站關鍵詞優(yōu)化電子商務企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設