1. 部署簡(jiǎn)單
成都創(chuàng)新互聯(lián)公司是一家專(zhuān)注于網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),金湖網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:金湖等地區(qū)。金湖做網(wǎng)站價(jià)格咨詢(xún):13518219792
Go
編譯生成的是一個(gè)靜態(tài)可執(zhí)行文件,除了glibc外沒(méi)有其他外部依賴(lài)。這讓部署變得異常方便:目標(biāo)機(jī)器上只需要一個(gè)基礎(chǔ)的系統(tǒng)和必要的管理、監(jiān)控工具,完全不需要操心應(yīng)用所需的各種包、庫(kù)的依賴(lài)關(guān)系,大大減輕了維護(hù)的負(fù)擔(dān)。
2. 并發(fā)性好
Goroutine和channel使得編寫(xiě)高并發(fā)的服務(wù)端軟件變得相當(dāng)容易,很多情況下完全不需要考慮鎖機(jī)制以及由此帶來(lái)的各種問(wèn)題。單個(gè)Go應(yīng)用也能有效的利用多個(gè)CPU核,并行執(zhí)行的性能好。
3. 良好的語(yǔ)言設(shè)計(jì)
從學(xué)術(shù)的角度講Go語(yǔ)言其實(shí)非常平庸,不支持許多高級(jí)的語(yǔ)言特性;但從工程的角度講,Go的設(shè)計(jì)是非常優(yōu)秀的:規(guī)范足夠簡(jiǎn)單靈活,有其他語(yǔ)言基礎(chǔ)的程序員都能迅速上手。更重要的是
Go 自帶完善的工具鏈,大大提高了團(tuán)隊(duì)協(xié)作的一致性。
4. 執(zhí)行性能好
雖然不如 C 和 Java,但相比于其他編程語(yǔ)言,其執(zhí)行性能還是很好的,適合編寫(xiě)一些瓶頸業(yè)務(wù),內(nèi)存占用也非常省。
類(lèi)型 在變量名后邊
也可不顯式聲明類(lèi)型, 類(lèi)型推斷, 但是是靜態(tài)語(yǔ)言, name一開(kāi)始放字符串就不能再賦值數(shù)字
方法,屬性 分開(kāi) 方法名首字母大寫(xiě)就是就是外部可調(diào)的
面向?qū)ο笤O(shè)計(jì)的一個(gè)重要原則:“優(yōu)先使用組合而不是繼承”
Dog 也是Animal , 要復(fù)用Animal 的屬性和方法,
只需要在結(jié)構(gòu)體 type 里面寫(xiě) Animal
入口也是main, 用用試試
多態(tài), 有這個(gè)方法就是這個(gè)接口的實(shí)現(xiàn), 具體的類(lèi) 不需要知道自己實(shí)現(xiàn)了什么接口,
使用: 在一個(gè)函數(shù)調(diào)用之前加上關(guān)鍵字go 就啟動(dòng)了一個(gè)goroutine
創(chuàng)建一個(gè)goroutine,它會(huì)被加入到一個(gè)全局的運(yùn)行隊(duì)列當(dāng)中,
調(diào)度器 會(huì)把他們分配給某個(gè) 邏輯處理器 的隊(duì)列,
一個(gè)邏輯處理器 綁定到一個(gè) 操作系統(tǒng)線程 ,在上面運(yùn)行g(shù)oroutine,
如果goroutine需要讀寫(xiě)文件, 阻塞 ,就脫離邏輯處理器 直接 goroutine - 系統(tǒng)線程 綁定
編譯成同名.exe 來(lái)執(zhí)行, 不通過(guò)虛擬機(jī), 直接是機(jī)器碼, 和C 一樣, 所以非常快
但是也有自動(dòng)垃圾回收,每個(gè)exe文件當(dāng)中已經(jīng)包含了一個(gè)類(lèi)似于虛擬機(jī)的runtime,進(jìn)行g(shù)oroutine的調(diào)度
默認(rèn)是靜態(tài)鏈接的,那個(gè)exe會(huì)把運(yùn)行時(shí)所需要的所有東西都加進(jìn)去,這樣就可以把exe復(fù)制到任何地方去運(yùn)行了, 因此 生成的 .exe 文件非常大
Go語(yǔ)言中沒(méi)有“類(lèi)”的概念,也不支持“類(lèi)”的繼承等面向?qū)ο蟮母拍?。Go語(yǔ)言中通過(guò)結(jié)構(gòu)體的內(nèi)嵌再配合接口比面向?qū)ο缶哂懈叩臄U(kuò)展性和靈活性。
自定義類(lèi)型
在Go語(yǔ)言中有一些基本的數(shù)據(jù)類(lèi)型,如string、整型、浮點(diǎn)型、布爾等數(shù)據(jù)類(lèi)型, Go語(yǔ)言中可以使用type關(guān)鍵字來(lái)定義自定義類(lèi)型。
自定義類(lèi)型是定義了一個(gè)全新的類(lèi)型。我們可以基于內(nèi)置的基本類(lèi)型定義,也可以通過(guò)struct定義。例如:
通過(guò)Type關(guān)鍵字的定義,MyInt就是一種新的類(lèi)型,它具有int的特性。
類(lèi)型別名
類(lèi)型別名是Go1.9版本添加的新功能。
類(lèi)型別名規(guī)定:TypeAlias只是Type的別名,本質(zhì)上TypeAlias與Type是同一個(gè)類(lèi)型。就像一個(gè)孩子小時(shí)候有小名、乳名,上學(xué)后用學(xué)名,英語(yǔ)老師又會(huì)給他起英文名,但這些名字都指的是他本人。
type TypeAlias = Type
我們之前見(jiàn)過(guò)的rune和byte就是類(lèi)型別名,他們的定義如下:
類(lèi)型定義和類(lèi)型別名的區(qū)別
類(lèi)型別名與類(lèi)型定義表面上看只有一個(gè)等號(hào)的差異,我們通過(guò)下面的這段代碼來(lái)理解它們之間的區(qū)別。
結(jié)果顯示a的類(lèi)型是main.NewInt,表示main包下定義的NewInt類(lèi)型。b的類(lèi)型是int。MyInt類(lèi)型只會(huì)在代碼中存在,編譯完成時(shí)并不會(huì)有MyInt類(lèi)型。
Go語(yǔ)言中的基礎(chǔ)數(shù)據(jù)類(lèi)型可以表示一些事物的基本屬性,但是當(dāng)我們想表達(dá)一個(gè)事物的全部或部分屬性時(shí),這時(shí)候再用單一的基本數(shù)據(jù)類(lèi)型明顯就無(wú)法滿(mǎn)足需求了,Go語(yǔ)言提供了一種自定義數(shù)據(jù)類(lèi)型,可以封裝多個(gè)基本數(shù)據(jù)類(lèi)型,這種數(shù)據(jù)類(lèi)型叫結(jié)構(gòu)體,英文名稱(chēng)struct。 也就是我們可以通過(guò)struct來(lái)定義自己的類(lèi)型了。
Go語(yǔ)言中通過(guò)struct來(lái)實(shí)現(xiàn)面向?qū)ο蟆?/p>
結(jié)構(gòu)體的定義
使用type和struct關(guān)鍵字來(lái)定義結(jié)構(gòu)體,具體代碼格式如下:
其中:
舉個(gè)例子,我們定義一個(gè)Person(人)結(jié)構(gòu)體,代碼如下:
同樣類(lèi)型的字段也可以寫(xiě)在一行,
這樣我們就擁有了一個(gè)person的自定義類(lèi)型,它有name、city、age三個(gè)字段,分別表示姓名、城市和年齡。這樣我們使用這個(gè)person結(jié)構(gòu)體就能夠很方便的在程序中表示和存儲(chǔ)人信息了。
語(yǔ)言?xún)?nèi)置的基礎(chǔ)數(shù)據(jù)類(lèi)型是用來(lái)描述一個(gè)值的,而結(jié)構(gòu)體是用來(lái)描述一組值的。比如一個(gè)人有名字、年齡和居住城市等,本質(zhì)上是一種聚合型的數(shù)據(jù)類(lèi)型
結(jié)構(gòu)體實(shí)例化
只有當(dāng)結(jié)構(gòu)體實(shí)例化時(shí),才會(huì)真正地分配內(nèi)存。也就是必須實(shí)例化后才能使用結(jié)構(gòu)體的字段。
基本實(shí)例化
舉個(gè)例子:
我們通過(guò).來(lái)訪問(wèn)結(jié)構(gòu)體的字段(成員變量),例如p1.name和p1.age等。
匿名結(jié)構(gòu)體
在定義一些臨時(shí)數(shù)據(jù)結(jié)構(gòu)等場(chǎng)景下還可以使用匿名結(jié)構(gòu)體。
創(chuàng)建指針類(lèi)型結(jié)構(gòu)體
我們還可以通過(guò)使用new關(guān)鍵字對(duì)結(jié)構(gòu)體進(jìn)行實(shí)例化,得到的是結(jié)構(gòu)體的地址。 格式如下:
從打印的結(jié)果中我們可以看出p2是一個(gè)結(jié)構(gòu)體指針。
需要注意的是在Go語(yǔ)言中支持對(duì)結(jié)構(gòu)體指針直接使用.來(lái)訪問(wèn)結(jié)構(gòu)體的成員。
取結(jié)構(gòu)體的地址實(shí)例化
使用對(duì)結(jié)構(gòu)體進(jìn)行取地址操作相當(dāng)于對(duì)該結(jié)構(gòu)體類(lèi)型進(jìn)行了一次new實(shí)例化操作。
p3.name = "七米"其實(shí)在底層是(*p3).name = "七米",這是Go語(yǔ)言幫我們實(shí)現(xiàn)的語(yǔ)法糖。
結(jié)構(gòu)體初始化
沒(méi)有初始化的結(jié)構(gòu)體,其成員變量都是對(duì)應(yīng)其類(lèi)型的零值。
使用鍵值對(duì)初始化
使用鍵值對(duì)對(duì)結(jié)構(gòu)體進(jìn)行初始化時(shí),鍵對(duì)應(yīng)結(jié)構(gòu)體的字段,值對(duì)應(yīng)該字段的初始值。
也可以對(duì)結(jié)構(gòu)體指針進(jìn)行鍵值對(duì)初始化,例如:
當(dāng)某些字段沒(méi)有初始值的時(shí)候,該字段可以不寫(xiě)。此時(shí),沒(méi)有指定初始值的字段的值就是該字段類(lèi)型的零值。
使用值的列表初始化
初始化結(jié)構(gòu)體的時(shí)候可以簡(jiǎn)寫(xiě),也就是初始化的時(shí)候不寫(xiě)鍵,直接寫(xiě)值:
使用這種格式初始化時(shí),需要注意:
結(jié)構(gòu)體內(nèi)存布局
結(jié)構(gòu)體占用一塊連續(xù)的內(nèi)存。
輸出:
【進(jìn)階知識(shí)點(diǎn)】關(guān)于Go語(yǔ)言中的內(nèi)存對(duì)齊推薦閱讀:在 Go 中恰到好處的內(nèi)存對(duì)齊
面試題
請(qǐng)問(wèn)下面代碼的執(zhí)行結(jié)果是什么?
構(gòu)造函數(shù)
Go語(yǔ)言的結(jié)構(gòu)體沒(méi)有構(gòu)造函數(shù),我們可以自己實(shí)現(xiàn)。 例如,下方的代碼就實(shí)現(xiàn)了一個(gè)person的構(gòu)造函數(shù)。 因?yàn)閟truct是值類(lèi)型,如果結(jié)構(gòu)體比較復(fù)雜的話,值拷貝性能開(kāi)銷(xiāo)會(huì)比較大,所以該構(gòu)造函數(shù)返回的是結(jié)構(gòu)體指針類(lèi)型。
調(diào)用構(gòu)造函數(shù)
方法和接收者
Go語(yǔ)言中的方法(Method)是一種作用于特定類(lèi)型變量的函數(shù)。這種特定類(lèi)型變量叫做接收者(Receiver)。接收者的概念就類(lèi)似于其他語(yǔ)言中的this或者 self。
方法的定義格式如下:
其中,
舉個(gè)例子:
方法與函數(shù)的區(qū)別是,函數(shù)不屬于任何類(lèi)型,方法屬于特定的類(lèi)型。
指針類(lèi)型的接收者
指針類(lèi)型的接收者由一個(gè)結(jié)構(gòu)體的指針組成,由于指針的特性,調(diào)用方法時(shí)修改接收者指針的任意成員變量,在方法結(jié)束后,修改都是有效的。這種方式就十分接近于其他語(yǔ)言中面向?qū)ο笾械膖his或者self。 例如我們?yōu)镻erson添加一個(gè)SetAge方法,來(lái)修改實(shí)例變量的年齡。
調(diào)用該方法:
值類(lèi)型的接收者
當(dāng)方法作用于值類(lèi)型接收者時(shí),Go語(yǔ)言會(huì)在代碼運(yùn)行時(shí)將接收者的值復(fù)制一份。在值類(lèi)型接收者的方法中可以獲取接收者的成員值,但修改操作只是針對(duì)副本,無(wú)法修改接收者變量本身。
什么時(shí)候應(yīng)該使用指針類(lèi)型接收者
任意類(lèi)型添加方法
在Go語(yǔ)言中,接收者的類(lèi)型可以是任何類(lèi)型,不僅僅是結(jié)構(gòu)體,任何類(lèi)型都可以擁有方法。 舉個(gè)例子,我們基于內(nèi)置的int類(lèi)型使用type關(guān)鍵字可以定義新的自定義類(lèi)型,然后為我們的自定義類(lèi)型添加方法。
注意事項(xiàng): 非本地類(lèi)型不能定義方法,也就是說(shuō)我們不能給別的包的類(lèi)型定義方法。
結(jié)構(gòu)體的匿名字段
匿名字段默認(rèn)采用類(lèi)型名作為字段名,結(jié)構(gòu)體要求字段名稱(chēng)必須唯一,因此一個(gè)結(jié)構(gòu)體中同種類(lèi)型的匿名字段只能有一個(gè)。
嵌套結(jié)構(gòu)體
一個(gè)結(jié)構(gòu)體中可以嵌套包含另一個(gè)結(jié)構(gòu)體或結(jié)構(gòu)體指針。
嵌套匿名結(jié)構(gòu)體
當(dāng)訪問(wèn)結(jié)構(gòu)體成員時(shí)會(huì)先在結(jié)構(gòu)體中查找該字段,找不到再去匿名結(jié)構(gòu)體中查找。
嵌套結(jié)構(gòu)體的字段名沖突
嵌套結(jié)構(gòu)體內(nèi)部可能存在相同的字段名。這個(gè)時(shí)候?yàn)榱吮苊馄缌x需要指定具體的內(nèi)嵌結(jié)構(gòu)體的字段。
結(jié)構(gòu)體的“繼承”
Go語(yǔ)言中使用結(jié)構(gòu)體也可以實(shí)現(xiàn)其他編程語(yǔ)言中面向?qū)ο蟮睦^承。
結(jié)構(gòu)體字段的可見(jiàn)性
結(jié)構(gòu)體中字段大寫(xiě)開(kāi)頭表示可公開(kāi)訪問(wèn),小寫(xiě)表示私有(僅在定義當(dāng)前結(jié)構(gòu)體的包中可訪問(wèn))。
結(jié)構(gòu)體與JSON序列化
JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。易于人閱讀和編寫(xiě)。同時(shí)也易于機(jī)器解析和生成。JSON鍵值對(duì)是用來(lái)保存JS對(duì)象的一種方式,鍵/值對(duì)組合中的鍵名寫(xiě)在前面并用雙引號(hào)""包裹,使用冒號(hào):分隔,然后緊接著值;多個(gè)鍵值之間使用英文,分隔。
結(jié)構(gòu)體標(biāo)簽(Tag)
Tag是結(jié)構(gòu)體的元信息,可以在運(yùn)行的時(shí)候通過(guò)反射的機(jī)制讀取出來(lái)。 Tag在結(jié)構(gòu)體字段的后方定義,由一對(duì)反引號(hào)包裹起來(lái),具體的格式如下:
`key1:"value1" key2:"value2"`
結(jié)構(gòu)體標(biāo)簽由一個(gè)或多個(gè)鍵值對(duì)組成。鍵與值使用冒號(hào)分隔,值用雙引號(hào)括起來(lái)。鍵值對(duì)之間使用一個(gè)空格分隔。 注意事項(xiàng): 為結(jié)構(gòu)體編寫(xiě)Tag時(shí),必須嚴(yán)格遵守鍵值對(duì)的規(guī)則。結(jié)構(gòu)體標(biāo)簽的解析代碼的容錯(cuò)能力很差,一旦格式寫(xiě)錯(cuò),編譯和運(yùn)行時(shí)都不會(huì)提示任何錯(cuò)誤,通過(guò)反射也無(wú)法正確取值。例如不要在key和value之間添加空格。
例如我們?yōu)镾tudent結(jié)構(gòu)體的每個(gè)字段定義json序列化時(shí)使用的Tag:
計(jì)算機(jī)編程語(yǔ)言,尤其是面向?qū)ο蟮木幊陶Z(yǔ)言,雖然語(yǔ)法不同,但其原理大都是相通的!那么go語(yǔ)言的method方法的繼承是否也有像python一樣的順序繼承的機(jī)制呢?我們來(lái)用一個(gè)簡(jiǎn)單的實(shí)例探討一下。
因此,結(jié)論是go語(yǔ)言結(jié)構(gòu)體(類(lèi))的繼承并沒(méi)有像python那樣的順序機(jī)制。
go語(yǔ)言method方法的繼承、重寫(xiě),繼承順序的探討 - 大器編程
Go語(yǔ)言也稱(chēng) Golang,兼具效率、性能、安全、健壯等特性。這套Go語(yǔ)言教程(Golang教程)通俗易懂,深入淺出,既適合沒(méi)有基礎(chǔ)的讀者快速入門(mén),也適合工作多年的程序員查閱知識(shí)點(diǎn)。
Go 語(yǔ)言
這套教程在講解一些知識(shí)點(diǎn)時(shí),將 Go 語(yǔ)言和其他多種語(yǔ)言進(jìn)行對(duì)比,讓掌握其它編程語(yǔ)言的讀者能迅速理解 Go 語(yǔ)言的特性。Go語(yǔ)言從底層原生支持并發(fā),無(wú)須第三方庫(kù)、開(kāi)發(fā)者的編程技巧和開(kāi)發(fā)經(jīng)驗(yàn)就可以輕松搞定。
Go語(yǔ)言(或 Golang)起源于 2007 年,并在 2009 年正式對(duì)外發(fā)布。Go 是非常年輕的一門(mén)語(yǔ)言,它的主要目標(biāo)是“兼具 Python 等動(dòng)態(tài)語(yǔ)言的開(kāi)發(fā)速度和 C/C++ 等編譯型語(yǔ)言的性能與安全性”。
Go語(yǔ)言是編程語(yǔ)言設(shè)計(jì)的又一次嘗試,是對(duì)類(lèi)C語(yǔ)言的重大改進(jìn),它不但能讓你訪問(wèn)底層操作系統(tǒng),還提供了強(qiáng)大的網(wǎng)絡(luò)編程和并發(fā)編程支持。Go語(yǔ)言的用途眾多,可以進(jìn)行網(wǎng)絡(luò)編程、系統(tǒng)編程、并發(fā)編程、分布式編程。
Go語(yǔ)言的推出,旨在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性,具有“部署簡(jiǎn)單、并發(fā)性好、語(yǔ)言設(shè)計(jì)良好、執(zhí)行性能好”等優(yōu)勢(shì),目前國(guó)內(nèi)諸多 IT 公司均已采用Go語(yǔ)言開(kāi)發(fā)項(xiàng)目。Go語(yǔ)言有時(shí)候被描述為“C 類(lèi)似語(yǔ)言”,或者是“21 世紀(jì)的C語(yǔ)言”。Go 從C語(yǔ)言繼承了相似的表達(dá)式語(yǔ)法、控制流結(jié)構(gòu)、基礎(chǔ)數(shù)據(jù)類(lèi)型、調(diào)用參數(shù)傳值、指針等很多思想,還有C語(yǔ)言一直所看中的編譯后機(jī)器碼的運(yùn)行效率以及和現(xiàn)有操作系統(tǒng)的無(wú)縫適配。
因?yàn)镚o語(yǔ)言沒(méi)有類(lèi)和繼承的概念,所以它和 Java 或 C++ 看起來(lái)并不相同。但是它通過(guò)接口(interface)的概念來(lái)實(shí)現(xiàn)多態(tài)性。Go語(yǔ)言有一個(gè)清晰易懂的輕量級(jí)類(lèi)型系統(tǒng),在類(lèi)型之間也沒(méi)有層級(jí)之說(shuō)。因此可以說(shuō)Go語(yǔ)言是一門(mén)混合型的語(yǔ)言。
此外,很多重要的開(kāi)源項(xiàng)目都是使用Go語(yǔ)言開(kāi)發(fā)的,其中包括 Docker、Go-Ethereum、Thrraform 和 Kubernetes。Go 是編譯型語(yǔ)言,Go 使用編譯器來(lái)編譯代碼。編譯器將源代碼編譯成二進(jìn)制(或字節(jié)碼)格式;在編譯代碼時(shí),編譯器檢查錯(cuò)誤、優(yōu)化性能并輸出可在不同平臺(tái)上運(yùn)行的二進(jìn)制文件。要?jiǎng)?chuàng)建并運(yùn)行 Go 程序,程序員必須執(zhí)行如下步驟。
使用文本編輯器創(chuàng)建 Go 程序;
保存文件;編譯程序;運(yùn)行編譯得到的可執(zhí)行文件。
這不同于 Python、Ruby 和 JavaScript 等語(yǔ)言,它們不包含編譯步驟。Go 自帶了編譯器,因此無(wú)須單獨(dú)安裝編譯器。
鏈喬教育在線旗下學(xué)碩創(chuàng)新區(qū)塊鏈技術(shù)工作站是中國(guó)教育部學(xué)校規(guī)劃建設(shè)發(fā)展中心開(kāi)展的“智慧學(xué)習(xí)工場(chǎng)2020-學(xué)碩創(chuàng)新工作站 ”唯一獲準(zhǔn)的“區(qū)塊鏈技術(shù)專(zhuān)業(yè)”試點(diǎn)工作站。專(zhuān)業(yè)站立足為學(xué)生提供多樣化成長(zhǎng)路徑,推進(jìn)專(zhuān)業(yè)學(xué)位研究生產(chǎn)學(xué)研結(jié)合培養(yǎng)模式改革,構(gòu)建應(yīng)用型、復(fù)合型人才培養(yǎng)體系。
類(lèi)的成員函數(shù) 有時(shí)也稱(chēng)為 方法 。因此,方法可以認(rèn)為是傳統(tǒng)面向?qū)ο笾?類(lèi)的成員函數(shù) 。不同的是,go中方法可以綁定到任何類(lèi)型上,但是成員函數(shù)只能屬于類(lèi)。
用來(lái)描述主調(diào)方法,就像向?qū)ο蟀l(fā)送消息。
不允許本身是指針的類(lèi)型進(jìn)行方法聲明。
與繼承的不同,組合中的順序也是無(wú)意義的。
參考一等函數(shù),方法做變量
首字母大小寫(xiě),要封裝一個(gè)對(duì)象,只能通過(guò)結(jié)構(gòu)體。