go語言中標(biāo)簽的使用 go語言文檔

golang中級(jí)進(jìn)階(二):結(jié)構(gòu)體

目錄

創(chuàng)新互聯(lián)建站長(zhǎng)期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為普洱企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì),普洱網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

一、結(jié)構(gòu)體詳解

1. 結(jié)構(gòu)體定義

2. 實(shí)例化結(jié)構(gòu)體的7種方法

二、結(jié)構(gòu)體方法

1. 結(jié)構(gòu)體的方法定義

2. 結(jié)構(gòu)體內(nèi)自定義方法的引用

3. 任意類型添加方法

三、嵌套、繼承

1. 匿名結(jié)構(gòu)體

2. 結(jié)構(gòu)體中可以定義任意類型的字段

3. 結(jié)構(gòu)體嵌套結(jié)構(gòu)體

4. 結(jié)構(gòu)體嵌套匿名結(jié)構(gòu)體

5. 結(jié)構(gòu)體嵌套多個(gè)匿名結(jié)構(gòu)體

6. 結(jié)構(gòu)體繼承

四、結(jié)構(gòu)體和JSON相互轉(zhuǎn)換

1. 結(jié)構(gòu)體轉(zhuǎn)化成json

2. json轉(zhuǎn)化成結(jié)構(gòu)體

3. 結(jié)構(gòu)體標(biāo)簽 tag

4. 嵌套結(jié)構(gòu)體和json的序列化反序列化

Golang 中沒有“類”的概念,Golang 中的結(jié)構(gòu)體和其他語言中的類有點(diǎn)相似。和其他面向?qū)?象語言中的類相比,Golang 中的結(jié)構(gòu)體具有更高的擴(kuò)展性和靈活性。

Golang 中的基礎(chǔ)數(shù)據(jù)類型可以表示一些事物的基本屬性,但是當(dāng)我們想表達(dá)一個(gè)事物的全 部或部分屬性時(shí),這時(shí)候再用單一的基本數(shù)據(jù)類型就無法滿足需求了,Golang 提供了一種 自定義數(shù)據(jù)類型,可以封裝多個(gè)基本數(shù)據(jù)類型,這種數(shù)據(jù)類型叫結(jié)構(gòu)體,英文名稱 struct。 也就是我們可以通過 struct 來定義自己的類型了。

使用 type 和 struct 關(guān)鍵字來定義結(jié)構(gòu)體,具體代碼格式如下:

type 類型名 struct {

字段名 字段類型

字段名 字段類型 …

}

其中:

? 類型名:表示自定義結(jié)構(gòu)體的名稱,在同一個(gè)包內(nèi)不能重復(fù)。

? 字段名:表示結(jié)構(gòu)體字段名。結(jié)構(gòu)體中的字段名必須唯一。

? 字段類型:表示結(jié)構(gòu)體字段的具體類型。

在 go 語言中,沒有類的概念但是可以給類型(結(jié)構(gòu)體,自定義類型)定義方法。所謂方法 就是定義了接收者的函數(shù)。接收者的概念就類似于其他語言中的 this 或者 self。

方法的定義格式如下:

func (接收者變量 接收者類型) 方法名(參數(shù)列表) (返回參數(shù)) {

函數(shù)體

}

注意:想改變結(jié)構(gòu)體內(nèi)的值,必須先變成指針。

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

注意:匿名結(jié)構(gòu)體中不允許出現(xiàn)多個(gè)重復(fù)的類型

注意:如果結(jié)構(gòu)體里面有私有屬性也就是小寫定義的字段,則不會(huì)被json使用

Go語言的%d,%p,%v等占位符的使用

這些是死知識(shí),把常用的記住,不常用的直接查表就行了

golang 的fmt 包實(shí)現(xiàn)了格式化I/O函數(shù),類似于C的 printf 和 scanf。

type Human struct {

Name string

}

var people = Human{Name:"zhangsan"}

golang沒有 '%u' 點(diǎn)位符,若整數(shù)為無符號(hào)類型,默認(rèn)就會(huì)被打印成無符號(hào)的。

寬度與精度的控制格式以Unicode碼點(diǎn)為單位。寬度為該數(shù)值占用區(qū)域的最小寬度;精度為小數(shù)點(diǎn)之后的位數(shù)。

操作數(shù)的類型為int時(shí),寬度與精度都可用字符 '*' 表示。

對(duì)于 %g/%G 而言,精度為所有數(shù)字的總數(shù),例如:123.45,%.4g 會(huì)打印123.5,(而 %6.2f 會(huì)打印123.45)。

%e 和 %f 的默認(rèn)精度為6

對(duì)大多數(shù)的數(shù)值類型而言,寬度為輸出的最小字符數(shù),如果必要的話會(huì)為已格式化的形式填充空格。

而以字符串類型,精度為輸出的最大字符數(shù),如果必要的話會(huì)直接截?cái)唷?/p>

使用起來很簡(jiǎn)單,一般配合fmt.Printf()使用,因?yàn)閒mt的Printf()是有格式的輸出,切忌使用Println(),否則將會(huì)以字符串的形式輸出。

查看原文: golang fmt格式“占位符”

Go 語言交叉編譯和構(gòu)建標(biāo)簽

現(xiàn)代應(yīng)用支持多平臺(tái)運(yùn)行是一件稀松平常的事情,在 Go 語言里面,為了支持應(yīng)用的多平臺(tái)部署,給用戶提供了方便的配置方式來輕松構(gòu)建針對(duì)不同操作系統(tǒng)和平臺(tái)的運(yùn)行文件。

Go 的構(gòu)建約束,即構(gòu)建標(biāo)簽,是以 // go:build 為開始的行注釋,如果是 1.16 或之前的版本,格式是 // +build 。跟此變更相關(guān)的 issue 可以參考 25348 。

構(gòu)建標(biāo)簽必須出現(xiàn)在 package 子句之前。為了區(qū)分構(gòu)建標(biāo)簽和包文檔的描述注釋,構(gòu)建標(biāo)簽后面應(yīng)該有一個(gè)空行。

構(gòu)建標(biāo)簽由||, , !運(yùn)算符以及括號(hào)來組合表達(dá)。運(yùn)算符與 Go 中的含義相同。

例如,以下構(gòu)建標(biāo)簽在滿足 linux 和 386 約束,或者滿足 darwin 而 cgo 不滿足時(shí)構(gòu)建文件:

//go:build (linux 386) || (darwin !cgo)

又如:僅在使用 cgo 時(shí),且僅在 Linux 和 OS X 上構(gòu)建文件: //go:build cgo (linux || darwin)

注意:1.17 及以后的表達(dá)格式里,一個(gè)文件有多個(gè) //go:build 行是錯(cuò)誤的。

在 1.16 及以前的版本,多行構(gòu)建標(biāo)簽是允許的,并且組合方式是通過空格和逗號(hào)等來區(qū)分,空格符表示 OR,逗號(hào)表示 AND,感嘆號(hào)表示 NOT。而多行之間則表示 OR。gofmt 命令將在遇到舊語法時(shí)添加等效的 //go:build 約束。如下是示例:

如果文件名在去除擴(kuò)展名和可能的 _test 后綴后匹配以下任何模式, (例如:source_windows_amd64.go)其中 GOOS 和 GOARCH 分別代表任何已知的操作系統(tǒng)和體系結(jié)構(gòu)值,那么認(rèn)為該文件除了文件中的任何顯式約束之外,具有這些術(shù)語的所表達(dá)的隱式構(gòu)建標(biāo)簽。

除了官方提供的針對(duì)不同平臺(tái)的內(nèi)置標(biāo)簽,用戶也可以使用自定義標(biāo)簽,例如 //go:build prod , 只需要在執(zhí)行 go build 時(shí)顯式帶上標(biāo)簽名 go build --tags=prod 。

想要使文件構(gòu)建時(shí)被忽略,可以使用: //go:build ignore ,其他任何沒有被用來定義為標(biāo)簽的詞也可以,但"ignore"是約定俗成的。)。Go 語言目前支持的系統(tǒng)和架構(gòu)可以參考 官方文檔 。

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

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

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

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

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

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

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

4)匿名變量

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

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

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

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

1)基本常量

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

2)預(yù)定義常量

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

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

3)枚舉

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

2)Go語言定義了兩個(gè)浮點(diǎn)型float32和float64,其中前者等價(jià)于C語言的float類型,后者等價(jià)于C語言的double類型

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

復(fù)數(shù)實(shí)際上是由兩個(gè)實(shí)數(shù)(在計(jì)算機(jī)中使用浮點(diǎn)數(shù)表示)構(gòu)成,一個(gè)表示實(shí)部(real)、一個(gè)表示虛部(imag)。也就是數(shù)學(xué)上的那個(gè)復(fù)數(shù)

復(fù)數(shù)的表示

實(shí)部與虛部

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

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

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

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

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

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

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

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

GO語言(十一):開始使用多模塊工作區(qū)

本教程介紹 Go 中多模塊工作區(qū)的基礎(chǔ)知識(shí)。使用多模塊工作區(qū),您可以告訴 Go 命令您正在同時(shí)在多個(gè)模塊中編寫代碼,并輕松地在這些模塊中構(gòu)建和運(yùn)行代碼。

在本教程中,您將在共享的多模塊工作區(qū)中創(chuàng)建兩個(gè)模塊,對(duì)這些模塊進(jìn)行更改,并在構(gòu)建中查看這些更改的結(jié)果。

本教程需要 go1.18 或更高版本。使用go.dev/dl中的鏈接確保您已在 Go 1.18 或更高版本中安裝了 Go 。

首先,為您要編寫的代碼創(chuàng)建一個(gè)模塊。

1、打開命令提示符并切換到您的主目錄。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為工作區(qū)的目錄。

3、初始化模塊

我們的示例將創(chuàng)建一個(gè)hello依賴于 golang.org/x/example 模塊的新模塊。

創(chuàng)建你好模塊:

使用 . 添加對(duì) golang.org/x/example 模塊的依賴項(xiàng)go get。

在 hello 目錄下創(chuàng)建 hello.go,內(nèi)容如下:

現(xiàn)在,運(yùn)行 hello 程序:

在這一步中,我們將創(chuàng)建一個(gè)go.work文件來指定模塊的工作區(qū)。

在workspace目錄中,運(yùn)行:

該go work init命令告訴為包含目錄中模塊的工作空間go創(chuàng)建一個(gè)文件 。go.work./hello

該go命令生成一個(gè)go.work如下所示的文件:

該go.work文件的語法與go.mod相同。

該go指令告訴 Go 應(yīng)該使用哪個(gè)版本的 Go 來解釋文件。它類似于文件中的go指令go.mod 。

該use指令告訴 Go在進(jìn)行構(gòu)建時(shí)hello目錄中的模塊應(yīng)該是主模塊。

所以在模塊的任何子目錄中workspace都會(huì)被激活。

2、運(yùn)行工作區(qū)目錄下的程序

在workspace目錄中,運(yùn)行:

Go 命令包括工作區(qū)中的所有模塊作為主模塊。這允許我們?cè)谀K中引用一個(gè)包,即使在模塊之外。在模塊或工作區(qū)之外運(yùn)行g(shù)o run命令會(huì)導(dǎo)致錯(cuò)誤,因?yàn)樵揼o命令不知道要使用哪些模塊。

接下來,我們將golang.org/x/example模塊的本地副本添加到工作區(qū)。然后,我們將向stringutil包中添加一個(gè)新函數(shù),我們可以使用它來代替Reverse.

在這一步中,我們將下載包含該模塊的 Git 存儲(chǔ)庫的副本golang.org/x/example,將其添加到工作區(qū),然后向其中添加一個(gè)我們將從 hello 程序中使用的新函數(shù)。

1、克隆存儲(chǔ)庫

在工作區(qū)目錄中,運(yùn)行g(shù)it命令來克隆存儲(chǔ)庫:

2、將模塊添加到工作區(qū)

該go work use命令將一個(gè)新模塊添加到 go.work 文件中。它現(xiàn)在看起來像這樣:

該模塊現(xiàn)在包括example.com/hello模塊和 `golang.org/x/example 模塊。

這將允許我們使用我們將在模塊副本中編寫的新代碼,而不是使用命令stringutil下載的模塊緩存中的模塊版本。

3、添加新功能。

我們將向golang.org/x/example/stringutil包中添加一個(gè)新函數(shù)以將字符串大寫。

將新文件夾添加到workspace/example/stringutil包含以下內(nèi)容的目錄:

4、修改hello程序以使用該功能。

修改workspace/hello/hello.go的內(nèi)容以包含以下內(nèi)容:

從工作區(qū)目錄,運(yùn)行

Go 命令在go.work文件指定的hello目錄中查找命令行中指定的example.com/hello模塊 ,同樣使用go.work文件解析導(dǎo)入golang.org/x/example。

go.work可以用來代替添加replace 指令以跨多個(gè)模塊工作。

由于這兩個(gè)模塊在同一個(gè)工作區(qū)中,因此很容易在一個(gè)模塊中進(jìn)行更改并在另一個(gè)模塊中使用它。

現(xiàn)在,要正確發(fā)布這些模塊,我們需要發(fā)布golang.org/x/example 模塊,例如在v0.1.0. 這通常通過在模塊的版本控制存儲(chǔ)庫上標(biāo)記提交來完成。發(fā)布完成后,我們可以增加對(duì) golang.org/x/example模塊的要求hello/go.mod:

這樣,該go命令可以正確解析工作區(qū)之外的模塊。

名稱欄目:go語言中標(biāo)簽的使用 go語言文檔
網(wǎng)頁網(wǎng)址:http://muchs.cn/article6/doooiog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、ChatGPT品牌網(wǎng)站建設(shè)

廣告

聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)