package (包)
- 一個目錄下面所有的.go文件的包名必須相同. 包名一般和目錄名相同(是約定, 不是強制), 包名都小寫
- main包是一個特殊的包名, 在main包中, 必須包含func main()函數
- 導入包(import)的時候, 使用的是包所在目錄的路徑, 路徑中不用包含包的名字, 在使用包的時候,直接用包名(如 fmt.Println)
可見性規則
當標識符(包括常量、變量、類型、函數名、結構字段等等)以一個大寫字母開頭,如:Group1,那么使用這種形式的標識符的對象就可以被外部包的代碼所使用(客戶端程序需要先導入這個包),這被稱為導出(像面向對象語言中的 public);標識符如果以小寫字母開頭,則對包外是不可見的,但是他們在整個包的內部是可見并且可用的(像面向對象語言中的 private )。
聲明語句
Go語言主要有四種類型的聲明語句:var、const、type和func,分別對應變量、常量、類型和函數實體對象的聲明
函數
main 和 init 函數既沒有參數,也沒有返回類型
占位符??https://studygolang.com/articles/2644
- %t? :?布爾類型
- %p?:?指針,?表示為十六進制,并加上前導的0x
- %s?:?字符串
- %c?:?字符
- %b ,?%o ,?%d?:?二進制 ,?八進制 ,?十進制
- %x ,?%X?:?十六進制小寫 ,?十六進制大寫
- %T?:?變量類型
- %v?:?根據數據類型輸出對應格式的值
- %%?:?百分號
- %q?:?用引號包含字符串
- %5s , %-5s :?在格式化數字時,可以在動詞的“%”后面使用一個數字來控制結果圖形的寬度和精度。默認為右對齊, 在數字前面加上"-"可以左對齊
- %06d :?使用0而不是空格填充, 對于數值類型會把填充的0放在正負號后面
- %3.3f : 浮點數的寬度和精度
內置函數
- len : 返回某個類型的長度或數量
- cap
- new
- make
- new 和 make的區別? https://studygolang.com/articles/1890
數組
數組的長度和類型一起構成了數組的類型, 比如 var array?
實現接口 https://www.jianshu.com/p/d87c69ac6ce7
當涉及到我們該怎么讓我們的類型實現接口時,Go 語言是特別的一個。Go 語言不需要我們顯式的實現類型的接口。如果一個接口里的所有方法都被我們的類型實現了,那么我們就說該類型實現了該接口。
數據類型
- 布爾類型不能接受其他類型的賦值,不支持自動或強制的類型轉換
- int和int32在Go語言里被認為是兩種不同的類型
可賦值(這里不能叫類型轉換, 用可賦值表達更準確些)
A value x is assignable to a variable of type T ("x is assignable to T") in any of these cases:
在一下這些情況值x可以賦值給類型為T的變量(x可以賦值給T)
1. x's type is identical to T.
1. x的類型和T的類型相同
2. x's type V and T have identical underlying types and at least one of V or T is not a named type.
2.?x和T具有相同的底層類型, 并且x和T至少有一個是非命名類型
3. T is an interface type and x implements T.
3. T是接口類型,x實現了T
4. x is a bidirectional channel value, T is a channel type, x's type V and T have identical element types, and at least one of V or T is not a named type.
4. x是雙向的chan類型的值, T是chan類型, x和T具有相同的元素類型, 并且x和T至少有一個是非命名類型
5. x is the predeclared identifier nil and T is a pointer, function, slice, map, channel, or interface type.
5. x的值為nil, 并且T是指針、函數、切片、映射、通道或接口類型
6. x is an untyped constant representable by a value of type T.
6. x是一個沒有指定類型的常量, 可以賦值給類型T(這里要遵循第一條原則, 但數字類型除外)
?
整型數據類型及取值范圍
類型 | 字節 | 范圍 |
int8 | ?1 | ?-128 ~ 127 |
uint8 | ?1 | ?0 ~ 255 |
int16 | ?2 | ?-32 768 ~ 32 767 |
uint16 | ?2 | ?0 ~ 65 535 |
int32 | ?4 | ?-2 147 483 648 ~ 2 147 483 647 |
uint32 | ?4 | ?0 ~ 4 294 967 295 |
int64 | ?8 | ?-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 |
uint64 | ?8 | ?0 ~ 18 446 744 073 709 551 615 |
int | 平臺相關? | ?平臺相關 |
uint | 平臺相關? | 平臺相關? |
uintptr | ?同指針 | 在32位平臺下為4字節,64位平臺下為8字節 |
?
goroutine/channel
- goroutine是Go語言中的輕量級線程實現,由Go運行時(runtime)管理
- 函數調用前加上go關鍵字,這次調用就會在一個新的goroutine中并發執行。當被調用的函數返回時,這個goroutine也自動結束了。需要注意的是,如果這個函數有返回值,那么這個返回值會被丟棄。
- 在沒有使用channel時,? Go程序從初始化main package并執行main()函數開始,當main()函數返回時,程序退出,且程序并不等待其他goroutine(非主goroutine)結束。
- 在向channel中寫入數據前, 對channel的讀操作是阻塞的, 讀channel的位置就是同步goroutine的位置
?