一、檔案名稱&關鍵字&標識符 所有go源碼都是以.go結尾 標識符以字母或底線開頭,大小寫敏感 底線_是特殊標識符,使用者忽略結果 保留關鍵字 匯入包時可以設定別名
下面是保留關鍵字:
二、GO程式的基本結構
package mainimport ( "fmt")func main(){ fmt.Println("Hello world")}
任何一個代碼必須隸屬一個包 import關鍵字,引入其他包 golang可執行程式,package main 並且只有一個main入口函數 包中函數的調用,同一個函數中可以直接調用;不同包中函數,通過包名+點+函數名進行調用 包存取控制規則,大寫意味著這個函數或者變數可以匯出的,及在其他包內是可以調用的;小寫以為這個函數或者變數是私人的,包外部不能訪問。
小練習1
寫一個小程式,對於給定的一個數字n,求出所有兩兩相加等於n的組合
package mainimport ( "fmt")func add_num(n int){ for i:=0;i<=n;i++{ fmt.Printf("%d+%d=%d\n",i,n-i,n) }}func main(){ add_num(5)}
小練習2
寫一個小程式,包含兩個包,add和main,其中add包中有兩個變數:Name,和age,請問main包中如何訪問Name和age。(用於理解go中大小寫敏感的問題)
main包中的代碼:
package main import ( "fmt" "go_dev/day02/kexia02/add")func main() { fmt.Println(add.Name)}
add包中的代碼
package add var Name string = "zhaofan"var age int = 23
從結果我們可以發現我們在main包中是不能調用到add包中的age,但是是可以調用到Name
這裡就是因為大小寫問題,go中的大寫可以理解為其他語言中的public,小寫理解為private
這裡有個問題需要注意:
我們把add包中的代碼改為:
package addvar Name stringvar Age intName = "zhaofan"Age = 23
這樣也是錯誤的寫法,go作為編譯型語言,必須通過函數來進行語句的執行,而不能在函數外執行語句
小練習3
開發一個小程式,使用包別名來訪問包中的函數或變數
直接對上一個程式的main包變更
package mainimport ( "fmt" a "go_dev/day02/kexia02/add")func main() { fmt.Println(a.Name) fmt.Println(a.Age)}
小練習4
每個源檔案都可以包含一個init函數,這個init函數自動被go運行架構調用,通過下面例子示範:
package mainimport ( "fmt")func init(){ fmt.Println("執行初始化函數")}func main() { fmt.Println("hello world")}
運行結果是先列印了init函數的內容,後列印了main函數中的問題,所以init函數先與main函數執行 三、函數的聲明和注釋
函式宣告
格式為:func 函數名字(參數列表)(傳回值列表)
例子如下:
func add(){
}
func add(a int,b int) int{
}
func add(a int,b int) (int int){
}
注釋
單行注釋//
多行注釋/* */ 四、GO語言的資料類型和操作符
常見資料類型及分類
GO語言按照類別分為幾下幾種資料類型:
布爾型:true或false,例子:var b bool = true
數字類型:包括整型int和浮點float
字串類型:這裡強調一下,GO的字串是由單個位元組串連起來的Go語言的字串的位元組使用UTF-8編碼標識Unicode文本。
衍生類別型:這裡包括指標類型,數群組類型,結構化類型,Channel類型,函數類型,介面類型,Map類型
注意:
字串的時候用雙引號”“,這裡也可以用反引號`,通過反引號的方式會保留你的格式,不會對你的內容做任何轉義
位元組的時候用單引號‘’,同樣也可以通過反引號`
var cc byte = 'c' fmt.println(ccc)
var cc byte = c fmt.println(cc)
一個會列印c的ASCII,一個會列印c
關於fmt.Printf()的用法
官網地址:https://go-zh.org/pkg/fmt/
一般
%v 相應值的預設格式。在列印結構體時,“加號”標記(%+v)會添加欄位名
%#v 相應值的Go文法表示
%T 相應值的類型的Go文法表示
%% 字面上的百分比符號,並非值的預留位置
布爾
%t 單詞 true 或 false。
整數
%b 二進位表示
%c 相應Unicode碼點所表示的字元
%d 十進位表示
%o 八進位表示
%q 單引號圍繞的字元字面值,由Go文法安全地轉義
%x 十六進位表示,字母形式為小寫 a-f
%X 十六進位表示,字母形式為大寫 A-F
%U Unicode格式:U+1234,等同於 "U+%04X"
浮點數及其複合構成
%b 無小數部分的,指數為二的冪的科學計數法,與 strconv.FormatFloat
的 'b' 轉換格式一致。例如 -123456p-78
%e 科學計數法,例如 -1234.456e+78
%E 科學計數法,例如 -1234.456E+78
%f 有小數點而無指數,例如 123.456
%g 根據情況選擇 %e 或 %f 以產生更緊湊的(無末尾的0)輸出
%G 根據情況選擇 %E 或 %f 以產生更緊湊的(無末尾的0)輸出
字串與位元組切片
%s 字串或切片的無解譯位元組
%q 雙引號圍繞的字串,由Go文法安全地轉義
%x 十六進位,小寫字母,每位元組兩個字元
%X 十六進位,大寫字母,每位元組兩個字元
指標
%p 十六進位表示,首碼 0x
通過fmt.Printf() 可以格式化輸出到終端,如果想要格式化儲存到變數則是fmt.Sprintf()
數字類型
數字類型包括了:
uint8(無符號8位整型,0到255)
uint16(無符號16位整型,0到65535)
uint32(無符號32位整型,0到4294967295)
unint64(無符號64位整型,0到18446744073709551615)
int8(有符號8位整型,-128到127)
int16(有符號16位整型,-32768到32767)
int32(有符號32位整型 ,-2147483648 到 2147483647)
int64(有符號64位整型 ,-9223372036854775808到9223372036854775807)
浮點型
flat32: 32位浮點型數
flag64: 64位浮點型數
complex64:32 位實數和虛數
complex128:64 位元實數和虛數
類型轉換
舉個例子來理解: var a int = 8 轉換為int32 var b int32 = int32(a)
當我們代碼中設計到資料計算的時候,要保證兩個資料類型完全相同,
var a int 和 var b int32 是不能直接做計算處理的,這個時候就需要用到類型轉換
相關操作符
。 && || 分別表示非,與,或
== 、=、!=、 <、>、<=、>=
練習1
使用math/rand產生隨機整數,10個小於100的隨機整數以及10個隨機浮點數
package mainimport ( "fmt" "math/rand")func rand_print(){ for i:=0;i<10;i++{ fmt.Println(rand.Int31n(100)) fmt.Println(rand.Float32()) }}func main() { rand_print()}
但是這裡會造成每次運行程式產生的隨機數是相同的,解決方式是加入隨機種子:rand.Seed(time.Now().Unix()) 五、常量
常用cost修飾,代表永遠是唯讀不能修改
const只能修飾boolean,number(int相互關聯類型,浮點類型,complex)和string
文法
const 變數名 [變數類型] = value其中變數類型可以省略
例子
const b string = "hello"
const b int = 23
通常定義常亮的寫法
const (
a = 0
b = 1
)
進階方法
const (
a = iota
b
c
)
這裡自動回吧a賦值為0,後面的變數一次加1