于c語(yǔ)言相同,go中也有指針和結(jié)構(gòu)體的概念。指針表示變量的內(nèi)存地址,結(jié)構(gòu)體用來(lái)存儲(chǔ)同一類型的數(shù)據(jù)。
10余年的麒麟網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整麒麟建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“麒麟網(wǎng)站設(shè)計(jì)”,“麒麟網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
定義一個(gè)指針變量,將變量a的地址賦給指針變量p。這樣,指針變量p也就指向了變量a所在的內(nèi)容空間。
new 函數(shù)返回一個(gè)指針變量
fmt.scan() 就是傳入一個(gè)指針變量。
兩種方法都可以使用。
以上簡(jiǎn)要介紹了go語(yǔ)言中的指針和結(jié)構(gòu)體。
作為C語(yǔ)言家族的一員,go和c一樣也支持結(jié)構(gòu)體。可以類比于java的一個(gè)POJO。
在學(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)體。
字段名的大小寫決定了字段是否包外可用。只有大寫的字段可以被包外引用。
還有一個(gè)點(diǎn)提一下
如果換行來(lái)寫
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)存零開銷這樣的特性,我們?cè)谌粘?Go 開發(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)體字段,可以省略字段名,只寫結(jié)構(gòu)體名。默認(rèn)字段名就是結(jié)構(gòu)體名
這種方式稱為 嵌入字段
語(yǔ)法糖2:
如果是以嵌入字段形式寫的結(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)。
大家好,我是小白,有點(diǎn)黑的那個(gè)白。
最近遇到一個(gè)問(wèn)題,因?yàn)闃I(yè)務(wù)需求,需要對(duì)接第三方平臺(tái).
而三方平臺(tái)提供的一些HTTP(S)接口都有統(tǒng)一的密鑰生成規(guī)則要求.
為此我們封裝了一個(gè)獨(dú)立的包 xxx-go-sdk 以便維護(hù)和對(duì)接使用.
其中核心的部分是自定義HTTP Client,如下:
一些平臺(tái)會(huì)要求appKey/appSecret等信息,所以Client結(jié)構(gòu)體就變成了這樣,這時(shí)參數(shù)還比較少, 而且是必填的參數(shù),我們可以提供構(gòu)造函數(shù)來(lái)明確指定。
看起來(lái)很滿足,但是當(dāng)我們需要增加一個(gè) Timeout 參數(shù)來(lái)控制超時(shí)呢?
或許你會(huì)說(shuō)這還不簡(jiǎn)單,像下面一樣再加一個(gè)參數(shù)唄
那再加些其他的參數(shù)呢?那構(gòu)造函數(shù)的參數(shù)是不是又長(zhǎng)又串,而且每個(gè)參數(shù)不一定是必須的,有些參數(shù)我們又會(huì)考慮默認(rèn)值的問(wèn)題。
為此,勤勞但尚未致富的 gophers 們使用了總結(jié)一種實(shí)踐模式
首先提取所有需要的參數(shù)到一個(gè)獨(dú)立的結(jié)構(gòu)體 Options,當(dāng)然你也可以用 Configs 啥的.
然后為每個(gè)參數(shù)提供設(shè)置函數(shù)
這樣我們就為每個(gè)參數(shù)設(shè)置了獨(dú)立的設(shè)置函數(shù)。返回值 func(*Options) 看著有點(diǎn)不友好,我們提取下定義為單個(gè) Option 調(diào)整一下代碼
當(dāng)我們需要添加更多的參數(shù)時(shí),只需要在 Options 添加新的參數(shù)并添加新參數(shù)的設(shè)置函數(shù)即可。
比如現(xiàn)在要添加新的參數(shù) Timeout
這樣后續(xù)不管新增多少參數(shù),只需要新增配置項(xiàng)并添加獨(dú)立的設(shè)置函數(shù)即可輕松擴(kuò)展,并且不會(huì)影響原有函數(shù)的參數(shù)順序和個(gè)數(shù)位置等。
至此,每個(gè)選項(xiàng)是區(qū)分開來(lái)了,那么怎么作用到我們的 Client 結(jié)構(gòu)體上呢?
首先,配置選項(xiàng)都被提取到了 Options 結(jié)構(gòu)體重,所以我們需要調(diào)整一下 Client 結(jié)構(gòu)體的參數(shù)
其次,每一個(gè)選項(xiàng)函數(shù)返回 Option,那么任意多個(gè)就是 ...Option,我們調(diào)整一下構(gòu)造函數(shù) NewClient 的參數(shù)形式,改為可變參數(shù),不再局限于固定順序的幾個(gè)參數(shù)。
然后循環(huán)遍歷每個(gè)選項(xiàng)函數(shù),來(lái)生成Client結(jié)構(gòu)體的完整配置選項(xiàng)。
那么怎么調(diào)用呢?對(duì)于調(diào)用方而已,直接在調(diào)用構(gòu)造函數(shù)NewClient()的參數(shù)內(nèi)添加自己需要的設(shè)置函數(shù)(WithXXX)即可
當(dāng)需要設(shè)置超時(shí)參數(shù),直接添加 WithTimeout即可,比如設(shè)置3秒的超時(shí)
配置選項(xiàng)的位置可以任意設(shè)置,不需要受常規(guī)的固定參數(shù)順序約束。
可以看到,這種實(shí)踐模式主要作用于配置選項(xiàng),利用函數(shù)支持的特性來(lái)實(shí)現(xiàn)的,為此得名 Functional Options Pattern,優(yōu)美的中國(guó)話叫做「函數(shù)選項(xiàng)模式」。
最后, 我們總結(jié)回顧一下在Go語(yǔ)言中函數(shù)選項(xiàng)模式的優(yōu)缺點(diǎn)
從語(yǔ)法講,重載是擴(kuò)展了函數(shù)(或方法)簽名,從只認(rèn)名字變?yōu)槊?參數(shù)類型,所以題主這個(gè)例子只要把不同參數(shù)的foo函數(shù)改成不同名字就好,比如foo1,foo2……
這個(gè)不支持按官方說(shuō)法,是為了保持語(yǔ)法簡(jiǎn)單,以及避免工程中遇到一些問(wèn)題,比如參數(shù)隱式轉(zhuǎn)換等等
而支持重載的語(yǔ)言也有它們的道理,有時(shí)候,函數(shù)或方法名字不是程序員自己能控制的,比如說(shuō),如果java不支持重載,那么只能有一個(gè)構(gòu)造函數(shù),通過(guò)不同輸入構(gòu)造對(duì)象就比較麻煩,需要弄成靜態(tài)方法create的方式:
代碼如下:
struct mar{
bool flag,sflag,nflag;
mar()flag(false),sflag(false),nflag(false) //默認(rèn)構(gòu)造函數(shù),指定初始化數(shù)值
{};
}
文章標(biāo)題:go語(yǔ)言結(jié)構(gòu)體構(gòu)造函數(shù) go語(yǔ)言結(jié)構(gòu)體指針
標(biāo)題鏈接:http://jinyejixie.com/article2/dochpic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、定制網(wǎng)站、企業(yè)建站、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站收錄、定制開發(fā)
聲明:本網(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)
猜你還喜歡下面的內(nèi)容