命名規則
- go語言中的函數、變量、常量、類型、語句標籤和包的名稱遵循一個簡單的規則:名稱的開頭是一個字母或者下劃線,後面可以跟任意數量的字符/數字和下劃線,並區分大小寫。如heapSort和HeapSort是不同名稱。
- 在命名時不能使用go語言語法中的保留關鍵字
- 函數名/變量名等 第一個字母的大小寫決定其可見行是否跨包。如果名稱以大寫字母開頭,它是導出的,意味者它對包外是可見的和可訪問的,可以被包之外的其他程序所引用。
func main() {
fmt.Println("hello world") //Println()以大寫字母開頭,可以被外面的包調用
}
- 命名風格:當遇到由單詞組合的名稱時,Go程序員使用"駝峯式"的風格–更喜歡使用大小寫而不是下劃線。
GO變量
語法格式:var name type = expression
:
- var:代表聲明一個變量
- name:變量名,十一哦那個駝峯式
- type:變量類型
- expression:變量表達式
- 類型與表達式部分可以省略一個,但是不能都省略。
- 類型省略,它的類型將由初始化表達式決定
- 表達式省略:其初始值對應於類型的零值:
a. 對於數字是0,
b. 對於布爾值是false,
c. 對於字符串是"",
d. 對於接口和引用類型(slice、指針、map、通道、函數)是nil。
e. 對於一個像數組或者結構體這樣的複合類型,零值是其所有元素或成員的零值。
常見的變量使用方式:
/*單變量*/
var tmp int //聲明一個int類型的變量,省略初始值,初始值默認爲0
var tmp int = 10 //聲明+初始化值爲10
var tmp = 10 //聲明+初始化,省略類型,由編譯器推導出類型
tmp := 10 //短變量聲明方式,聲明和初始化一個變量,一般在局部變量的聲明和初始化使用這種
/*多變量*/
tmp1, tmp2, tmp3 := 1, 2, 3
var tmp1, tmp2, tmp3 = 1,2,3
/*短變量複製注意點*/
tmp := 10
tmp, tmp1 := 11, 12 //短變量賦值時,需要保證左邊至少有一個變量沒有聲明過
go常量
- 常量是一種表達式,其可以保證在編譯階段就計算出表達式的值,並不需要等到運行時,從而使編譯器得以知曉其值。所以常量本質上都是屬於基本類型:布爾值、字符串或數字。
- 語法格式:
const name type = value
,type可以省略,例如:const pi = 3.1415926
- 常量生成器iota:
- iota是一個可以改變的常量,在編譯的過程中會被編譯器修改的變量
- iota不是一個值,他可以創建一系列相關值,而不是逐個值現式寫出。常量聲明中,iota從0開始取值,逐項加1
- iota在time包中的使用
// A Weekday specifies a day of the week (Sunday = 0, ...).
type Weekday int
const (
Sunday Weekday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
go基本數據類型
go語言同Java/C/C++一樣是強類型語言,所以在使用時需要對變量表明具體的類型。
數字類型
整數
- int8:有符號8位整型(-128到127)
- int16:有符號16位整型(-32768 到 32767)
- int32:有符號32位整型(-2147483648 到 2147483647)
- int64:有符號64位整型(-9223372036854775808 到 9223372036854775807)
- uint8:無符號8位整型(0 到 255)
- uint16:無符號16位整型(0到65535)
- uint32:無符號32位整型(0 到 4294967295)
- uint64:無符號64位整型(0 到 18446744073709551615)
- rune類型是int32類型的同義詞,常常用於指明一個值是Unicode碼點(code point)
- byte類型是uint8類型的同義詞,強調一個值是原始數據,而非量值
- uintptr類型是無符號整數,其大小不明確,但足以完整存放指針
浮點數
- float32:IEEE 754標準中的float32的大小,最大約爲3.4e38
- float64:IEEE 754標準中的float64的大小,最大約爲1.8e308
複數:
- complex64:由float32組成
- complex128:由float64組成
var x complex128 = complex(1, 2) // 1 + 2i
布爾類型
bool型首位值或布爾值(boolean)只有2種可能:真(true)和假(false)
var isTrue bool = true
字符串
- 字符串是不可變的字節序列,它可以包含任意數據,包括0值字節
- 文本字符串被解讀成按照UTF-8編碼的Unicode碼點(文本符號)序列。
- string底層其實就是一個[]byte(slice類型),並且可以直接跟[]byte類型互相轉換(string本質就是一個字符流)
- 字符串中的字符是不能修改的,string是一個只讀的類型,不能修改意味着兩個字符串能安全地公用同一段底層內存,使的複製任何長度字符串的開銷都很低廉
- 字符串的兩種格式:
var str string = "123456" //用於定義一個單行字符串
var str string = `hello
world` //``用於定義一個多行的字符串,內部進行原樣解析
- 字符串轉譯:
\a "警告"或響鈴
\b 退格符
\f 換頁符
\n 換行符(直接跳到下一行的同一位置)
\r 回車符(值返回到行首)
\t 製表符
\v 垂直製表符
\' 單引號
\" 雙引號
\\ 反斜槓
- 字符串支持易用str[0] 數組下標的方式訪問字符串中的單個元素
- 字符串支持使用+,進行字符串拼接
- 字符串和byte[] (字節slice)
go語言中提供類4個標準包對字符串操作特別重要:bytes、strings、strconv和unicode。- strings: 提供類了許多函數,用於搜索、替換、比較、修改、切片與鏈接字符串
- bytes:提供了與strings類似的函數,用於操作字節slice([]byte類型,其某些屬性和字符串相同),由於字符串不可變,因此按增量方式構建字符串會導致多次的內存分配和複製。bytes.Buffer類型會更高效。
- strconv:包中的函數主要用於轉換布爾值、整數、浮點數爲與之對應的字符串形式,或者把字符串轉換爲布爾值、整數、浮點數,還有爲字符串添加/去除引號的函數
- unicode:包備有判別文字符號值特性的函數,如IsDight、IsLetter、IsUpper和IsLower。
- 具體瞭解包中的所有函數與用法,可以參考go語言標準庫文檔中文版