sadsad

package main //表明這是一個命令源文件,必須包含一個main方法
func main() {
println("hello world")
}

/*
所有的源碼都放在src下

1.包概念簡介
Go語言中的包和其他語言的庫或模塊的概念類似,
目的都是爲了支持模塊化、封裝、單獨編譯和代碼重用。

包聲明語句之後是import語句導入依賴的其它包
然後是包一級的類型、變量、常量、函數的聲明語句
包一級的各種類型的聲明語句的順序無關緊要(譯註:函數內部的名字則必須先聲明之後才能使用)

字面量(literal)是用於表達源代碼中一個固定值的表示法
表達式,是由數字、算符、數字分組符號(括號)、自由變量和約束變量等以能求得數值的有意義排列方法所得的組合。約束變量在表達式中已被指定數值,而自由變量則可以在表達式之外另行指定數值。

每個源文件都是以包的聲明語句開始,用來指名包的名字。
在Go語言中,一個簡單的規則是:如果一個名字是大寫字母開頭的,那麼該名字是導出的(譯註:因爲漢字不區分大小寫,因此漢字開頭的名字是沒有導出的)
對於中文漢字,Unicode標誌都作爲小寫字母處理,因此中文的命名默認不能導出

包還可以讓我們通過控制哪些名字是外部可見的來隱藏內部實現信息。

語法塊決定了內部聲明的名字的作用域範圍。語法塊內部聲明的名字是無法被外部語法塊訪問的。
全局語法塊是整個源代碼;
每個包的包語法決包括 每個for、if、switch和組批量聲明等

聲明語句的作用域是指源代碼中可以有效使用這個名字的範圍

不要將作用域和生命週期混爲一談。聲明語句的作用域對應的是一個源代碼的文本區域;它
是一個編譯時的屬性。一個變量的生命週期是指程序運行時變量存在的有效時間段,在此時
間區域內它可以被程序的其他部分引用;是一個運行時的概念。

每個包只會被初始化一次。

常量,也就是在程序編譯階段就確定的值,在程序運行過程中無法改變的值
Go語言主要有四種類型的聲明語句:var、const、type和func,分別對應變量、常量、類型和函數實體對象的聲明。

這樣的init初始化函數除了不能被調用或引用外,其他行爲和普通函數類似。

對於在包級別聲明的變量,如果有初始化表達式則用表達式初始化,還有一些沒有初始化表
達式的,例如某些表格數據初始化並不是一個簡單的賦值過程。在這種情況下,我們可以用
一個特殊的init初始化函數來簡化初始化工作。每個文件都可以包含多個init初始化函數

Go語言中的函數名、變量名、常量名、類型名、語句標號和包名等所有的命名,都遵循一個
簡單的命名規則:一個名字必須以一個字母(Unicode字母)或下劃線開頭,後面可以跟任意
數量的字母、數字或下劃線。
*/

/*
如果一個名字是在函數內部定義,那麼它的就只在函數內部有效。如果是在函數外部定義,
那麼將在當前包的所有文件中都可以訪問。名字的開頭字母的大小寫決定了名字在包外的可
見性。如果一個名字是大寫字母開頭的(譯註:必須是在函數外部定義的包級名字;包級函
數名本身也是包級名字),那麼它將是導出的,也就是說可以被外部的包訪問,例如fmt包的
Printf函數就是導出的

名字的長度沒有邏輯限制,但是Go語言的風格是儘量使用短小的名字,對於局部變量尤其是
這樣;你會經常看到i之類的短名字,而不是冗長的theLoopIndex命名。通常來說,如果一個
名字的作用域比較大,生命週期也比較長,那麼用長的名字將會更有意義。

在習慣上,Go語言程序員推薦使用 駝峯式 命名

聲明語句定義了程序的各種實體對象以及部分或全部的屬性。Go語言主要有四種類型的聲明
語句:var、const、type和func,分別對應變量、常量、類型和函數實體對象的聲明。

一個Go語言編寫的程序對應一個或多個以.go爲文件後綴名的源文件中。每個源文件以包的聲
明語句開始,說明該源文件是屬於哪個包。包聲明語句之後是import語句導入依賴的其它包,
然後是包一級的類型、變量、常量、函數的聲明語句,包一級的各種類型的聲明語句的順序
無關緊要(譯註:函數內部的名字則必須先聲明之後才能使用)

如果初始化表達式被省略,那麼將用零值初始化該變
量。 數值類型變量對應的零值是0,布爾類型變量對應的零值是false,字符串類型對應的零
值是空字符串,接口或引用類型(包括slice、map、chan和函數)變量對應的零值是nil。

局部變量將在聲明語句被執行到的時候完成初始化。

簡短變量聲明左邊的變量可能並不是全部都是剛剛聲明的。果有一些已經在相同的詞法域聲明過了(§2.7),那麼簡短變量聲明語句對這些已經聲明過
的變量就只有賦值行爲了。

指針 一個變量對應一個保存了變量對應類型值的內存空間。
並不是每一個值都會有一個內存地址,但是對於每一個變量必然有對應的內存地址。
map爲什麼不能取地址
對於聚合類型每個成員——比如結構體的每個字段、或者是數組的每個元素——也都是對應一個變量,因此可以被取地址。
變量有時候被稱爲可尋址的值。

變量的生命週期指的是在程序運行期間變量有效存在的時間間隔。對於在包一級聲明的變量
來說,它們的生命週期和整個程序的運行週期是一致的。而相比之下,在局部變量的聲明周
期則是動態的:從每次創建一個新變量的聲明語句開始,直到該變量不再被引用爲止,然後
變量的存儲空間可能被回收。函數的參數變量和返回值變量都是局部變量。它們在函數每次
被調用的時候創建。

函數的有右小括弧也可以另起一行縮進,同時爲了防止編譯器在行尾自動插入分號而
導致的編譯錯誤,可以在末尾的參數變量後面顯式插入逗號
f函數裏的x變量必須在堆上分配,因爲它在函數退出後依然可以通過包一級的global變量找
到,雖然它是在函數內部定義的;用Go語言的術語說,這個x局部變量從函數f中逃逸了。

數值變量也可以支持 ++ 遞增和 -- 遞減語句(譯註:自增和自減是語句,而不是表達式,因此 x = i++ 之類的表達式是錯誤的)

元組賦值是另一種形式的賦值語句,它允許同時更新多個變量的值。

v, ok = m[key] // map lookup
v, ok = x.(T) // type assertion
v, ok = <-ch // channel receive

我們可以用下劃線空白標識符 _ 來丟棄不需要的值。

可賦值性的規則
:類型必須完全匹配,nil可以賦值給任何
指針或引用類型的變量。常量(§3.6)則有更靈活的賦值規則,因爲這樣可以避免不必要的
顯式的類型轉換。

對於兩個值是否可以用 == 或 != 進行相等比較的能力也和可賦值能力有關係:對於任何類型
的值的相等比較,第二個值必須是對第一個值類型對應的變量是可賦值的,反之依然。

一個類型聲明語句創建了一個新的類型名稱,和現有類型具有相同的底層結構。

新命名的類型提供了一個方法,用來分隔不同概念的類型,這樣即使它們底層類型相同也是不兼容的。
type 類型名字 底層
類型聲明語句一般出現在包一級,因此如果新創建的類型名字的首字符大寫,則在外部包也
可以使用。

只有當兩個類型的底層基礎類型
相同時,才允許這種轉型操作,或者是兩者都是指向相同底層結構的指針類型,這些轉換隻
改變類型而不會影響值本身。

數值類型之間的轉型也是允許的,並且在字符串和一些特定類型的slice之間也是可以轉換
的,在下一章我們會看到這樣的例子。這類轉換可能改變值的表現。

*/

/*
×××
浮點型
複數
布爾
字符串
常量

數組
切片
map
結構體

函數
方法
接口
channel

*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章