作為C語(yǔ)言家族的一員,go和c一樣也支持結(jié)構(gòu)體。可以類比于java的一個(gè)POJO。
成都創(chuàng)新互聯(lián)是一家專業(yè)提供臨沂企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為臨沂眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
在學(xué)習(xí)定義結(jié)構(gòu)體之前,先學(xué)習(xí)下定義一個(gè)新類型。
新類型 T1 是基于 Go 原生類型 int 定義的新自定義類型,而新類型 T2 則是 基于剛剛定義的類型 T1,定義的新類型。
這里要引入一個(gè)底層類型的概念。
如果一個(gè)新類型是基于某個(gè) Go 原生類型定義的, 那么我們就叫 Go 原生類型為新類型的底層類型
在上面的例子中,int就是T1的底層類型。
但是T1不是T2的底層類型,只有原生類型才可以作為底層類型,所以T2的底層類型還是int
底層類型是很重要的,因?yàn)閷?duì)兩個(gè)變量進(jìn)行顯式的類型轉(zhuǎn)換,只有底層類型相同的變量間才能相互轉(zhuǎn)換。底層類型是判斷兩個(gè)類型本質(zhì)上是否相同的根本。
這種類型定義方式通常用在 項(xiàng)目的漸進(jìn)式重構(gòu),還有對(duì)已有包的二次封裝方面
類型別名表示新類型和原類型完全等價(jià),實(shí)際上就是同一種類型。只不過(guò)名字不同而已。
一般我們都是定義一個(gè)有名的結(jié)構(gòu)體。
字段名的大小寫(xiě)決定了字段是否包外可用。只有大寫(xiě)的字段可以被包外引用。
還有一個(gè)點(diǎn)提一下
如果換行來(lái)寫(xiě)
Age: 66,后面這個(gè)都好不能省略
還有一個(gè)點(diǎn),觀察e3的賦值
new返回的是一個(gè)指針。然后指針可以直接點(diǎn)號(hào)賦值。這說(shuō)明go默認(rèn)進(jìn)行了取值操作
e3.Age 等價(jià)于 (*e3).Age
如上定義了一個(gè)空的結(jié)構(gòu)體Empty。打印了元素e的內(nèi)存大小是0。
有什么用呢?
基于空結(jié)構(gòu)體類型內(nèi)存零開(kāi)銷(xiāo)這樣的特性,我們?cè)谌粘?Go 開(kāi)發(fā)中會(huì)經(jīng)常使用空 結(jié)構(gòu)體類型元素,作為一種“事件”信息進(jìn)行 Goroutine 之間的通信
這種以空結(jié)構(gòu)體為元素類建立的 channel,是目前能實(shí)現(xiàn)的、內(nèi)存占用最小的 Goroutine 間通信方式。
這種形式需要說(shuō)的是幾個(gè)語(yǔ)法糖。
語(yǔ)法糖1:
對(duì)于結(jié)構(gòu)體字段,可以省略字段名,只寫(xiě)結(jié)構(gòu)體名。默認(rèn)字段名就是結(jié)構(gòu)體名
這種方式稱為 嵌入字段
語(yǔ)法糖2:
如果是以嵌入字段形式寫(xiě)的結(jié)構(gòu)體
可以省略嵌入的Reader字段,而直接訪問(wèn)ReaderName
此時(shí)book是一個(gè)各個(gè)屬性全是對(duì)應(yīng)類型零值的一個(gè)實(shí)例。不是nil。這種情況在Go中稱為零值可用。不像java會(huì)導(dǎo)致npe
結(jié)構(gòu)體定義時(shí)可以在字段后面追加標(biāo)簽說(shuō)明。
tag的格式為反單引號(hào)
tag的作用是可以使用[反射]來(lái)檢視字段的標(biāo)簽信息。
具體的作用還要看使用的場(chǎng)景。
比如這里的tag是為了幫助 encoding/json 標(biāo)準(zhǔn)包在解析對(duì)象時(shí)可以利用的規(guī)則。比如omitempty表示該字段沒(méi)有值就不打印出來(lái)。
obj := new(StructName) ?初始化Struct中的所有屬性都是零值,返回的是Struct指針,效果與StructName{}一致。
obj :=?StructName{Prop1:xx, Prop2:yy,...} ,?初始化Struct中的所有屬性,同時(shí)對(duì)指定屬性賦值,返回的是Struct值對(duì)象,作為參數(shù)傳遞時(shí),其屬性不會(huì)被修改。
obj := StructName{Prop1:xx, Prop2:yy,...} 同上,返回的是Struct值對(duì)象的指針,作為參數(shù)傳遞時(shí),其屬性可以被修改。
后面兩種使用方法更加靈活。
go語(yǔ)言和java類似
不需要人為的釋放內(nèi)存
當(dāng)所有的引用都失效后
系統(tǒng)會(huì)自動(dòng)回收內(nèi)存的。
new是內(nèi)建函數(shù),作用是初始化一個(gè)指向類型的指針,make的作用是slice,map或chan初始化并返回引用,第一個(gè)參數(shù)是一個(gè)類型,第二個(gè)參數(shù)是長(zhǎng)度。
我認(rèn)為,現(xiàn)在有以下幾種語(yǔ)言,依然火爆:首先是c語(yǔ)言,java語(yǔ)言,php語(yǔ)言,js,還有未來(lái)可能流行html5,web操作系統(tǒng)可能是未來(lái)的趨勢(shì).首先c語(yǔ)言必定無(wú)法消亡,因?yàn)檫@種語(yǔ)言底層的系統(tǒng)都是c語(yǔ)言寫(xiě)的.還有java,隨著安卓的流行,我覺(jué)得前途還是很好,我不覺(jué)得會(huì)有新系統(tǒng)打破安卓的壟斷,當(dāng)然蘋(píng)果是自成一派.還有php,這種語(yǔ)言,所有大部分網(wǎng)站都是用這個(gè)語(yǔ)言的.異常流行.至于,html5,我覺(jué)得很可能是確實(shí),隨著網(wǎng)速的發(fā)展,云系統(tǒng),可能是確實(shí),瀏覽器就是應(yīng)用./*如果還有疑問(wèn)請(qǐng)追問(wèn).如果解決了您的問(wèn)題.請(qǐng)盡快采納,支持我一下.謝謝.*/
新聞標(biāo)題:go語(yǔ)言new,go語(yǔ)言能做桌面程序嗎
分享網(wǎng)址:http://muchs.cn/article16/hssodg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、建站公司、網(wǎng)站改版、響應(yīng)式網(wǎng)站、外貿(mào)建站、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)