《Go語言聖經》學習筆記 2 程式結構(上)

2021-10-03 06:35:34 字數 2176 閱讀 2120

package main

import

"fmt"

func

main()

const i =

100// 可以將常量(變數)定義在最後面

上面程式是可以正常執行並輸出正確結果的。一級型別(全域性變數,函式)都可以定義在後面。

變數宣告語法:

var 變數名字 型別 = 表示式
使用方式如下:

func

main()

當**中的變數沒有初始化的時候,編譯器會自動進行零值初始化。零值初始化機制可以確保每個宣告的變數總是有乙個良好定義的值,因此在go語言中不存在未初始化的變數。這個特性可以簡化很多**,而且可以在沒有增加額外工作的前提下確保邊界條件下的合理行為。

另外,數值型別(如int, float等等)變數對應的零值是0,布林型別變數對應的零值是false,字串型別對應的零值是空字串,介面或引用型別(包括slice、指標、map、chan和函式)變數對應的零值是nil。

i, j :=0,

1// 宣告並初始化一組變數,型別會自動推導為int

j, k :=2,

3// 有乙個新的變數k,可以使用簡短變數宣告

// j, k := 4, 5 // compile error,都是已被宣告的變數,不能再次宣告

f, err := os.

open

(name)

// 使用函式的返回值進行宣告

指標這塊其實和c/c++使用方式大同小異。

funcf(

)*intfunc

main()

這點和c++還是有差異的,c++在在函式中返回函式中宣告的區域性變數的位址是很危險的行為,而go不會,原理在後面函式生命週期會講到。

另外,鼓勵在函式中多使用指標或者引用,特別是復合型別。這樣可以節省資源並且減少拷貝時間。

如以下**:

type student struct

func

printstudent

(s *student)

func

main()

fmt.

printf

("%p\n"

,&stu)

// stu的位址,輸出結果和上面的s是一致的

printstudent

(&stu)

}

new函式主要用於開闢新的記憶體空間。

個人感覺new函式並不如c++中使用的多,比如go允許在函式中建立區域性變數並返回區域性變數的位址,並且函式外使用該變數是可以的。上面有段**可以看出。

type student struct

func

main()

pi =

new(

int)

// 申請一塊記憶體

*pi =

10// 如果沒有申請記憶體就進行取值或者賦值操作會報錯

fmt.

println

(*pi)

var pstu *student // 也可以使用復合型別來建立指標

if pstu ==

nil pstu =

new(student)

// 申請一塊記憶體

pstu.name =

"mike"

pstu.age =

18 pstu.gender =

"man"

fmt.

println

(pstu.name, pstu.gender, pstu.age)

}

在堆還是在棧上面分配並非由var或new決定,由編譯器自己判斷。如以下**:

var global *

intfuncf(

)funcg(

)

編譯器判斷x變數從f()中逃逸出來,所以把它分配在堆中。而對於y,並不會從g()中逃逸出來,即便使用了new來申請了記憶體空間,所以編譯器可以選擇在棧上分配y的儲存空間(也可以選擇在堆上分配,然後由go語言的gc**這個變數的記憶體空間)。如果分配在棧上,g()函式執行結束時就對y進行**。

《Go語言聖經》學習筆記 5 函式

在go中,乙個函式可以返回多個值。乙個函式內部可以將另乙個有多返回值的函式作為返回值。可以將乙個返回多引數的函式作為該函式的引數。如果乙個函式將所有的返回值都顯示的變數名,那麼該函式的return語句可以省略運算元。這稱之為bare return。func add a,b,c int d,e int...

《Go聖經》章二 程式結構

參考書 go程式語言 go學習路徑的go基礎模組,整理了一些我掌握不太好的地方 go語言中,名稱的作用域越大,名稱越長且越有意義。包級初始化在main函式開始前執行。number 0 bool false string 介面 引用型別 slice,指標,map,通道,函式 nil 短宣告 左面至少有...

Go語言程式結構結構

4 賦值 5 型別 go語言的基礎組成包括 例如 package main import fmt func main go語言中的函式名 變數名 常量名 型別名 語句標號和包名等所有的命名,都遵循乙個簡單的命名規則 名字必須以乙個字母或下劃線開頭,後面可以跟任意數量的字母 數字或下劃線 區分大小寫 ...