《go程式語言》讀書筆記

2022-09-19 02:33:10 字數 2984 閱讀 9747

短變數宣告 := 是用來宣告和初始化區域性變數的;

短變數宣告最少宣告乙個新變數,否則,**無法通過編譯;

指標別名允許我們不用變數的名字來方文變數;不僅僅指標產生別名,當複製其他引用型別(像slice,map,channel,甚至包括這裡引用型別的結構體、陣列和介面)的值的時候,也會產生別名

new函式是乙個內建的函式,表示式new(t)

建立乙個未命名的t型別變數,初始化為t型別的零值,並返回其位址

一般情況下,每次呼叫new都返回乙個具有唯一位址的不同變數,除了乙個例外:兩個變數的型別不攜帶任何資訊且是零值,例如struct{} 和 [0]int, 當前的實現裡面,他們具有相同的位址

new是乙個預宣告的函式,不是乙個關鍵字

某個函式內的區域性變數,如果被全域性變數引用了,那麼它一定使用了堆變數,即使函式返回了,這個變數還是可以被訪問到,這種情況我們稱為變數從函式中逃逸;每次變數逃逸都需要一次額外的記憶體分配,因此在做效能優化時,是有好處的;

rune型別是 int32型別的同義詞,常常用來指明乙個值是unicode碼點,這兩個型別可以互換使用

取模運算子 % 只能用於整數,在go語言中,取模餘數的符號只與除數一致,-5%2 和 -5%-2的結果都是-3

除法的行為則與運算中是否都為整數相關,如

y1 := 5/4    //y1=1

y2 := 5.0/4  //y2=1.25

y3 := 5/4.0  // 1.25

y4 := 5.0/4/0 // 1.25

+x 表示一元取正

-x 表示一元取負

c = a &^ b含義:b 轉為二進位制時,值為1 的位置對應c的位置值為0;c中剩餘位置值與a對應位置值相同(即:所謂的位清空操作,把b中1對應位置在c位置上清空)

a := 12  // 00001100

b := 4   // 00000100

c := a &^ b  //00001000

fmt.println(c) // 8

var x complex128 = complex(3, 4) // 3 + 4i

字串可以和位元組byte相互轉化

var s 

= "vbadd"

b := byte(s)

c := string(b)

byte(s) 操作會分配新的位元組陣列,拷貝填入s含有的位元組,並生成乙個slice引用,指向整個陣列, 反之,用string()將byte轉換成字串也會產生乙份副本

bytes包為了高效處理位元組slice提供了buffer型別;buffer起初為空,其大小隨著各種型別資料的寫入而增長,bytes.buffer 變數無須初始化,原因是零值本來就有效

字串和數字的相互轉換

要將整數轉換成字串,一種選擇是fmt.sprintf另一種選擇是strconv.itoa

x := 123

y := fmt.sprintf("%d", x)

fmt.println(y, strconv.itoa(x)) // "123 123"

常量修飾符 const 可以宣告多個常量

iota建立一系列相關值,而不是逐個值顯式寫出,常量宣告中,iota從0開始取值,逐項加1。這種寫法常用來宣告列舉

iota 也可用於複雜的表示式

type flags int

​const (

flagup flags = 1 << iota

flagdown

flagbroadcast)​

const (

_   = 1 << (10 * iota)

kib // 1024

mibgib

tibpib

eibzib

yib)

​func main()

在陣列字面量上,如果省略號... 出現在陣列長度的位置,那麼陣列的長度由初始化陣列的元素個數決定;

陣列,slice,map 和結構體的字面語法都是相似的。可以按照 索引: 索引對應的值 這種方式進行陣列定義:

const (

usd int = iota

eurgbp )​

symbol := [...]string

​r := [...]int // 定義了乙個有100個元素的陣列r,除了最後乙個元素值是-1之外,該陣列中的其他元素值都是0

呼叫函式的時候,每個傳入的引數都會建立乙個副本,然後賦值給對應的函式變數,所以函式接受的是乙個副本,而不是原始的引數;

使用這種方式傳遞大的陣列會變得很低效,go把陣列和其他型別都看成值傳遞,而在其他的一些語言中,陣列是隱式使用引用傳遞。

slice表示乙個擁有相同型別元素的可變長度的序列,slice和陣列是緊密相連的,slice底層實現是個陣列,稱之為底層陣列;slice有三個屬性:指標、長度、容量

slice操作符s[i:j] 建立了乙個新的slice,這個新slice引用了序列s從i到j-1索引位置的所有元素

因為slice包含了指向陣列元素的指標,所以將乙個slice傳遞給函式的時候,可以在函式內部修改底層陣列的元素

func reverse(s int) }​

func main()

reverse(a[:])

fmt.println(a)

}

和陣列不同的是,slice無法做比較,因此不能用== 來測試兩個slice是否擁有相同的元素,標準庫只提供了位元組slice的比較函式 bytes.equal, 其他型別的比較需要我們自己寫函式;

slice唯一允許的比較操作是和nil做比較;

《Go語言程式設計》讀書筆記

go語言榮譽 執行時,沒有任何外部依賴 執行速度快,很適合開發共享軟體。加上,我之前一直用c 語言開發,go有更好的 c語言美稱。自動垃圾 原生併發程式設計 速度媲美c 程式。基於channel goroutine,適應多核系統開發 函式多重返回值 簡化錯誤處理 c語言風格。比如語言緊湊 格式化要求...

GO 語言程式設計讀書筆記 介面值

從概念上來講,乙個介面型別的值 簡稱介面值 其實有兩個部分 乙個具體型別和該型別的乙個值。二者稱為介面的動態型別和動態值。比如下面宣告乙個介面變數 w 並賦值,那麼 w 介面值可以用如下圖表示 介面的零值 介面的零值就是把它的動態型別和動態值都設為 nil,如下圖所示 var w io.writer...

《c程式語言》讀書筆記

舉例如下 char a 10 1 定義的時候直接用字串賦值 char a 10 hello 注意 不能先定義再給它賦值,如 char a 10 a 10 hello 這樣是錯誤的!2 對陣列中字元逐個賦值 char a 10 3 利用strcpy char a 10 strcpy a,hello 易...