短變數宣告 := 是用來宣告和初始化區域性變數的;
短變數宣告最少宣告乙個新變數,否則,**無法通過編譯;
指標別名允許我們不用變數的名字來方文變數;不僅僅指標產生別名,當複製其他引用型別(像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+x 表示一元取正y2 := 5.0/4 //y2=1.25
y3 := 5/4.0 // 1.25
y4 := 5.0/4/0 // 1.25
-x 表示一元取負
c = a &^ b含義:b 轉為二進位制時,值為1 的位置對應c的位置值為0;c中剩餘位置值與a對應位置值相同(即:所謂的位清空操作,把b中1對應位置在c位置上清空)
a := 12 // 00001100b := 4 // 00000100
c := a &^ b //00001000
fmt.println(c) // 8
var x complex128 = complex(3, 4) // 3 + 4i字串可以和位元組byte相互轉化
var sbyte(s) 操作會分配新的位元組陣列,拷貝填入s含有的位元組,並生成乙個slice引用,指向整個陣列, 反之,用string()將byte轉換成字串也會產生乙份副本= "vbadd"
b := byte(s)
c := string(b)
bytes包為了高效處理位元組slice提供了buffer型別;buffer起初為空,其大小隨著各種型別資料的寫入而增長,bytes.buffer 變數無須初始化,原因是零值本來就有效
字串和數字的相互轉換
要將整數轉換成字串,一種選擇是fmt.sprintf另一種選擇是strconv.itoa
x := 123y := 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) }和陣列不同的是,slice無法做比較,因此不能用== 來測試兩個slice是否擁有相同的元素,標準庫只提供了位元組slice的比較函式 bytes.equal, 其他型別的比較需要我們自己寫函式;func main()
reverse(a[:])
fmt.println(a)
}
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 易...