go語言的初始化,go指針初始化

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

本教程介紹 Go 中多模塊工作區的基礎知識。使用多模塊工作區,您可以告訴 Go 命令您正在同時在多個模塊中編寫代碼,并輕松地在這些模塊中構建和運行代碼。

為朔城等地區用戶提供了全套網頁設計制作服務,及朔城網站建設行業解決方案。主營業務為網站設計制作、網站設計、朔城網站設計,以傳統方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業、用心的態度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

在本教程中,您將在共享的多模塊工作區中創建兩個模塊,對這些模塊進行更改,并在構建中查看這些更改的結果。

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

首先,為您要編寫的代碼創建一個模塊。

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

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,為您的代碼創建一個名為工作區的目錄。

3、初始化模塊

我們的示例將創建一個hello依賴于 golang.org/x/example 模塊的新模塊。

創建你好模塊:

使用 . 添加對 golang.org/x/example 模塊的依賴項go get。

在 hello 目錄下創建 hello.go,內容如下:

現在,運行 hello 程序:

在這一步中,我們將創建一個go.work文件來指定模塊的工作區。

在workspace目錄中,運行:

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

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

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

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

該use指令告訴 Go在進行構建時hello目錄中的模塊應該是主模塊。

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

2、運行工作區目錄下的程序

在workspace目錄中,運行:

Go 命令包括工作區中的所有模塊作為主模塊。這允許我們在模塊中引用一個包,即使在模塊之外。在模塊或工作區之外運行go run命令會導致錯誤,因為該go命令不知道要使用哪些模塊。

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

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

1、克隆存儲庫

在工作區目錄中,運行git命令來克隆存儲庫:

2、將模塊添加到工作區

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

該模塊現在包括example.com/hello模塊和 `golang.org/x/example 模塊。

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

3、添加新功能。

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

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

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

修改workspace/hello/hello.go的內容以包含以下內容:

從工作區目錄,運行

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

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

由于這兩個模塊在同一個工作區中,因此很容易在一個模塊中進行更改并在另一個模塊中使用它。

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

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

golang 內置函數new 和struct 初始化的區別

obj := new(StructName) ?初始化Struct中的所有屬性都是零值,返回的是Struct指針,效果與StructName{}一致。

obj :=?StructName{Prop1:xx, Prop2:yy,...} ,?初始化Struct中的所有屬性,同時對指定屬性賦值,返回的是Struct值對象,作為參數傳遞時,其屬性不會被修改。

obj := StructName{Prop1:xx, Prop2:yy,...} 同上,返回的是Struct值對象的指針,作為參數傳遞時,其屬性可以被修改。

后面兩種使用方法更加靈活。

go語言中的var關鍵字是聲明變量還是定義+初始化變量

定義+初始化。

舉個例子

var num int //定義一個整形變量num,默認為0

var number int = 21 //定義一個整型變量number,并賦值為21

Go語言中new和 make的區別詳解

new 主要用于結構體的初始化

make用于數組array,切片slice,協程chnnel的初始化

例如: users:=make([10]int);

msg:=make(chan int);

new會分配結構空間,并初始化為清空為零,不進一步初始化

new之后需要一個指針來指向這個結構

make會分配結構空間及其附屬空間,并完成其間的指針初始化

make返回這個結構空間,不另外分配一個指針

例子new:

var p *[]int = new([]int)

p := new([]int)

以上分配了一個slice結構,但是結構中的應該指向底層數組的ptr指針為空,故實際不能往這個slice里面存取數據

同時分配了一個指針p,也即(在32位系統中)占4個字節并存放slice結構的地址

例子make:

var v []int = make([]int, 0)

v := make([]int, 0)

以上分配了一個slice結構,且結構中的應該指向底層數組的ptr指針已經指向了某個底層數組,這個底層數組應該已經分配了,故這個slice已經可以使用了

注意v就是這個slice結構,而不是一個指向slice的指針

上述僅是示例,一般使用時都會明確長度和容量:v := make([]int, 10, 50)

結論:

由上可見,用new來分配slice的意義不大,因為沒有恰當的初始化,無法直接使用

有附帶空間的結構,使用make來初始化,可以完成內部指針初始化,其后可以立即使用

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

Go語言作為出現比較晚的一門編程語言,在其原生支持高并發、云原生等領域的優秀表現,像目前比較流行的容器編排技術Kubernetes、容器技術Docker都是用Go語言寫的,像Java等其他面向對象的語言,雖然也能做云原生相關的開發,但是支持的程度遠沒有Go語言高,憑借其語言特性和簡單的編程方式,彌補了其他編程語言一定程度上的不足,一度成為一個熱門的編程語言。

最近在學習Go語言,我之前使用過C#、Java等面向對象編程的語言,發現其中有很多的編程方式和其他語言有區別的地方,好記性不如爛筆頭,總結一下,和其他語言做個對比。這里只總結差異的地方,具體的語法不做詳細的介紹。

種一棵樹最好的時間是十年前,其次是現在。

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

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

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

4)匿名變量

在使用其他語言時,有時候要獲取一個值,卻因為該函數返回多個值而不得不定義很多沒有的變量,Go語言可以借助多重返回值和匿名變量來避免這種寫法,使代碼看起來更優雅。

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

若指向獲得nickName,則函數調用可以這樣寫

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

1)基本常量

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

2)預定義常量

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

iota比較特殊,可以被任務是一個可被編譯器修改的常量,在每個const關鍵字出現時被重置為0,然后在下一個const出現之前每出現一個iota,其所代表的數字會自動加1.

3)枚舉

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

2)Go語言定義了兩個浮點型float32和float64,其中前者等價于C語言的float類型,后者等價于C語言的double類型

3)go語言支持復數類型

復數實際上是由兩個實數(在計算機中使用浮點數表示)構成,一個表示實部(real)、一個表示虛部(imag)。也就是數學上的那個復數

復數的表示

實部與虛部

對于一個復數z=complex(x,y),就可以通過Go語言內置函數real(z)獲得該復數的實部,也就是x,通過imag(z)獲得該復數的虛部,也就是y

4)數組(值類型,長度在定義后無法再次修改,每次傳遞都將產生一個副本。)

5)數組切片(slice)

數組切片(slice)彌補了數組的不足,其數據結構可以抽象為以下三個變量:

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

Go循環語句只支持for關鍵字,不支持while和do-while

goto語句的語義非常簡單,就是跳轉到本函數內的某個標簽

今天就介紹到這里,以后我會在總結Go語言在其他方面比如并發編程、面向對象、網絡編程等方面的不同及使用方法。希望對大家有所幫助。

golang 怎么判斷一個結構體有沒有被初始化過

ect1 := new(Rect)

rect2 := Rect{}

rect3 := Rect{0, 0, 100, 200}

rect4 := Rect{width:100, height:200}

注意這幾個變量全部為指向Rect結構的指針(指針變量),因為使用了new()函數和操作符.而如果使用方法

a := Rect{}

則表示這個是一個Rect{}類型.兩者是不一樣的.參考代碼:

func main() {

rect1 := Rect{0, 0, 100, 200}

rect1.x = 10

a := Rect{}

a.x = 15

fmt.Printf("%v\n%T\n", a, a)

fmt.Printf("%v\n%T\n", rect1, rect1)

}

運行結果為:

{15 0 0 0}

main.Rect

{10 0 100 200}

*main.Rect

當前題目:go語言的初始化,go指針初始化
分享URL:http://m.kartarina.com/article10/hddcdo.html

成都網站建設公司_創新互聯,為您提供用戶體驗云服務器企業網站制作建站公司商城網站做網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站網頁設計
主站蜘蛛池模板: 无码超乳爆乳中文字幕久久| 亚洲日韩精品A∨片无码 | 国产精品亚韩精品无码a在线| 中文字幕在线无码一区二区三区| 中文无码久久精品| 成在人线AV无码免费| 亚洲va中文字幕无码久久不卡| 无码喷水一区二区浪潮AV| 蜜桃无码一区二区三区| 自拍偷在线精品自拍偷无码专区| 69天堂人成无码麻豆免费视频| 中文字幕无码人妻AAA片| 18禁超污无遮挡无码免费网站国产| 亚洲色偷拍另类无码专区| 国产av激情无码久久| 亚洲日韩av无码中文| 一本无码中文字幕在线观| 亚洲av无码成人精品区一本二本| 亚洲AV无码久久寂寞少妇| 中文字幕无码一区二区三区本日 | 国产精品无码免费视频二三区| 午夜不卡无码中文字幕影院| 亚洲AV无码乱码在线观看| 亚洲色av性色在线观无码| 国产色无码精品视频免费| 国产99久久九九精品无码| 国产精品爽爽V在线观看无码| 亚洲Av永久无码精品一区二区| 久久国产精品无码HDAV| 无码专区久久综合久中文字幕 | 无码毛片内射白浆视频| 久久午夜无码鲁丝片| 免费看又黄又无码的网站| 无码人妻少妇久久中文字幕蜜桃| 丰满日韩放荡少妇无码视频| 国产成人无码专区| 亚洲精品无码精品mV在线观看 | 久久久久久久亚洲Av无码| 久久人妻无码中文字幕| 中文字幕无码精品亚洲资源网久久 | 国产成人精品无码免费看|