這篇文章將為大家詳細(xì)講解有關(guān)go中與java C++中應(yīng)該注意的語法糖以及不同點是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
目前創(chuàng)新互聯(lián)公司已為數(shù)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、商河網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
最近在用golang寫k8s operator(其中涉及到informer controler )用于內(nèi)部調(diào)度平臺用,剛好借此機(jī)會能夠與java版本的 informer controller進(jìn)行對比,由于之前對golang沒怎么接觸過,遇到了和java c++不同的語法糖,現(xiàn)在列舉一下:
每個 Go 文件都屬于且僅屬于一個包,必須在源文件中非注釋的第一行指明這個文件屬于哪個包,如:package main,package main 表示一個可獨立執(zhí)行的程序,
每個 Go 應(yīng)用程序都包含一個名為 main 的包。package main 包下可以有多個文件,但所有文件中只能有一個 main () 方法,main () 方法代表程序入口
golang中沒有class的概念,但是有struct,而且可以給struct增加方法,如下:
type Member struct { Id int `json:"id"` } //綁定到Member結(jié)構(gòu)的方法,但是這種不會改變member的值,因為結(jié)構(gòu)體是值傳遞,當(dāng)我們調(diào)用setID時,方法接收器接收到是只是結(jié)構(gòu)體變量的一個副本,通過副本對值進(jìn)行修復(fù),并不會影響調(diào)用者,因此,我們可以將方法接收器定義為指針變量,就可達(dá)到修改結(jié)構(gòu)體的目的 func (m Member)setId(id int){ m.Id = id } m := Member{} m.setId(1) fmt.Println(m.Id)//輸出為空 //綁定到Member結(jié)構(gòu)的方法,會改變member的值 func (m *Member)setId(id int){ m.Id = id } m := Member{} m.setId(1) fmt.Println(m.Id)//輸出為1
關(guān)于方法的接受者和接口如何被調(diào)用,參考如下:
不管方法的接收者是值還是指針,對象的值和指針均可以調(diào)用該方法型,那么方法的接受者可以是值類型也可以是指針類型
當(dāng)方法的接收者是值時,不管是值調(diào)用還是指針調(diào)用,方法內(nèi)部都是對原對象的副本進(jìn)行操作,不會影響原對象型,那么方法的接受者必須也是值類型該方法才可以被調(diào)用
當(dāng)方法的接收者是指針時,不管是值調(diào)用還是指針調(diào)用,方法內(nèi)部都是通過指針對原對象進(jìn)行操作,會影響原對象
注意:struct的屬性可以沒有名字而只有類型,使用時類型即為屬性名。(因此,一個struct中同一個類型的匿名屬性只能有一個)
在定義strut的結(jié)構(gòu)體時,可以添加tag,tag可以在運行時用到,以及形成json或者xml時用到如下:
type NetworkList struct { Project `json:",inline"` f2 int `json:"id,-"` f3 string `json:"f3,omitempty"` f4 string `json:"f4"` } type Project struct { Key string `json:"key"` Value string `json:"value"` }
其中,
名詞|解釋 ---|--- json:",inline"|表示內(nèi)嵌類型的key和外層struct的key是平行關(guān)系,如NetworkList里的key和Project key在形成json的時候是平行關(guān)系,不是內(nèi)嵌關(guān)系,也就是在同一級 json:"id,-"|-(橫杠) 表示私有字段,形成json的時候不包括該key json:"f3,omitempty|omitempty表示該字段為空,則生成json時,不包括該key json:"f4"|表示生成json時,key為f4
c++ java 中有隱式類型轉(zhuǎn)換,golang沒有,golang中有強(qiáng)制類型轉(zhuǎn)換和類型斷言
強(qiáng)制類型轉(zhuǎn)換
package main import "fmt" func main() { var a float32 = 5.6 var b int = 10 fmt.Println (a * float32(b)) }
類型斷言
package main import "fmt" func main() { var a interface{} =10 t,ok:= a.(int) if ok{ fmt.Println("int",t) } t2,ok:= a.(float32) if ok{ fmt.Println("float32",t2) } }
interface{}是空接口沒有任何方法,且所有類型都實現(xiàn)了空接口,相當(dāng)于java中的object,interface類型默認(rèn)是一個指針
go 關(guān)鍵字用來創(chuàng)建 goroutine (協(xié)程),是實現(xiàn)并發(fā)的關(guān)鍵
//go 關(guān)鍵字放在方法調(diào)用前新建一個 goroutine 并讓他執(zhí)行方法體 go GetThingDone(param1, param2); //上例的變種,新建一個匿名方法并執(zhí)行 go func(param1, param2) { }(val1, val2) //直接新建一個 goroutine 并在 goroutine 中執(zhí)行代碼塊 go { //do someting... }
defer 的執(zhí)行方式類似其他語言中的析構(gòu)函數(shù),在函數(shù)體執(zhí)行結(jié)束后按照調(diào)用順序的相反順序逐個執(zhí)行
即使函數(shù)發(fā)生嚴(yán)重錯誤也會執(zhí)行,相當(dāng)于finally
常用于資源清理、文件關(guān)閉、解鎖以及記錄時間等操作
func main() { fmt.Println("a") defer fmt.Println("b") defer fmt.Println("c") } //打印 //a //c //b
golang的init函數(shù)在該文件被被引用時才執(zhí)行(是import時,不是調(diào)用包函數(shù)時)
package lib import "fmt" func init() { fmt.Println("lib empty init ") } ---- package main import ( "Test/lib" "fmt" ) func main() { fmt.Println("wint") } // 輸出 //lib empty init //wint
該用法和java C++中差不多
func() { //func body }() //花括號后加()表示函數(shù)調(diào)用,此處聲明時為指定參數(shù)列表, //故調(diào)用執(zhí)行時也不需要傳參
關(guān)于go中與java C++中應(yīng)該注意的語法糖以及不同點是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。