一、基本資料類型和操作符
(1)檔案名&關鍵字&辨別符
-
1.1、檔案名
go程式的檔案名字尾為 .go -
1.2、辨別符
辨別符即表示成變量/函數名/類名等的字元串,以字母或下劃線開頭,大小寫敏感(和python類似), _ 是特殊辨別符,用來忽略結果 -
1.3、保留關鍵字
go語言保留了25個系統關鍵字:
(2)Go程式基本結構
go程式大體上由 “package包” “import引用包” “main函數主題” 組成:
注意事項
(3)Go程式包的概念
-
3.1、在包内引用另一個包
通過import關鍵字來引用包,go預設從 GOROOT 和 GOPATH 環境變量所在的路徑下的src目錄開始尋找import導入的包,是以建議你的包路徑要從 $GOPATH /src 的後面開始寫。
如果是系統提供的包,不需要輸入路徑,安裝GO語言環境時,已經預設在 $GOROOT /src 目錄下
-
3.2、如何引用另一個包内的變量/函數/方法
按照3.1的介紹,使用 import <包路徑> 來導入包,注意包的路徑,使用 <包名>/<包别名>.[函數]/[方法] 的形式來引用另一個包的變量或者方法 -
3.3、包的“自執行函數”
如果在包内聲明一個名稱為 init 的函數,那麼其他包在調用它時,會自動執行init函數(類似python類裡面的 _init_ 方法),具體寫法為:func init(){ ...<函數體> }
main包引用其他包時,執行的順序為:其他包的全局變量—>其他包的init函數—>main包内的main函數,當包的引用有嵌套時(引用的包又引用其他的包),優先執行嵌套最裡面的包
-
3.4、包的别名
在引用其他包時,在包的前面可以添加别名,使用别名來代替引用的包名,而特殊的别名: “_” 表示不調用引用包内的任何方法,隻執行引用包的init自執行函數package main import ( my_add "lessions/day2/pro2/add" //引用add包,并定義了包的别名為 my_add _ "lessions/day1/pro1/calc" //引用calc包,但不調用包内的任何變量/方法,隻是自動執行包内的init函數 ) func main() { mt.Printf(my_add.Name) //add包大寫變量可以調用 //fmt.Printf(my_add.age) //add包小寫變量無法調用 }
-
3.5、包的概念代碼範例
執行結果/*add包内的代碼*/ package add var Name string = "Chen" //聲明變量初始化 var age int = //聲明變量初始化 func init() { //自執行函數 Name = "Lin" age = } /*main主程式包内的代碼*/ //go調用其它包的包變量/函數/方法時,其他包需要将變量/函數/方法設定為大寫才能被調用 package main import ( "fmt" // "lessions/day2/pro2/add" _ "lessions/day1/pro1/calc" //引用calcs包,但不調用包内的任何變量/方法,隻是自動執行包内的init函數 my_add "lessions/day2/pro2/add" //引用add包,并定義了包的别名為 my_add ) func main() { fmt.Printf(my_add.Name) //add包大寫變量可以調用 // fmt.Printf(my_add.age) add包小寫變量無法調用 }
(4)函數
-
4.1、函數的聲明
==func <函數名> (參數清單) (傳回值清單) { …<函數體> }==
範例:
func add() {...} //簡單的函數,無參數 func add(a int,b String) {...} //帶2個形參的函數,無傳回值 func add(a int,b String) int {...} //帶2個形參的函數,有1個傳回值,類型為int func add(a int,b String) (int,int) {...} //帶2個形參的函數,有2個傳回值,類型為int
(5)常量和變量
-
5.1、常量介紹
常量在初始化值後,無法再次改變(參考C語言裡面的常量),常量能賦予的值隻有boolean,number(int相關類型、浮點類型、complex)和string這些類型。 -
5.2、常量的定義
使用關鍵字 ==const== 來定義一個常量:
==const <辨別符> [type] = value==
範例:
比較專業的常量定義寫法:const my_c string = "MY Classical Music"
const ( a = //定義一個常量 b= "ppap" //定義一個常量 c= //定義一個常量 )
定義常量可以不需要聲明類型
-
5.2、變量的定義
格式: ==var <變量名> [type]== -
5.3、變量的指派
- 方法一: 在定義變量時,初始化變量:
var number_a int = #更專業的初始化方法: var ( a int b int c string d bool e = f ="app" )
- 方法二: 定義變量後,指派:
var number_a int number_a =
- 方法三: 使用 :=符号,自動推導變量類型:
方法三相當于方法二,但是與方法一有本質差別,方法一稱為初始化。GO語言有個“不浪費”規定:當變量不使用時,變量不能指派(指派會占用記憶體空間)。但是方法一是初始化,可以在變量不使用時執行不報錯
-
5.4、變量的值類型和引用類型
程式在記憶體中開辟一個位置,然後将變量的值存入。存入的位置就是記憶體位址- #### 5.4.1、值類型
變量直接存儲值,記憶體通常在棧中配置設定。
基本資料類型 int、float、bool、string 以及 數組 和 struct 都屬于值類型
- #### 5.4.2、引用類型
變量存儲的是一個記憶體位址,這個位址存指向存儲的變量值。記憶體通常在堆上配置設定。通過GC回收。
指針、slice、map、chan 等都是引用類型
- #### 5.4.3、值類型和引用類型在函數内的差别
值類型在作為函數的形式參數時,直接拷貝到函數裡面稱為函數内的局部變量,而引用類型(記憶體位址)是将記憶體位址真正的傳入了函數,對記憶體位址指向的變量值的修改就是對外部傳入的引用類型變量的值的修改,可以
了解為當引用類型傳入函數時,其實就變成了“全局變量”(注意是記憶體位址指向的值變成全局變量,記憶體位址本身不是)
值類型傳入函數,函數在新開辟記憶體空間來存放變量值,而引用類型隻是複制一下記憶體位址
-
5.5、變量的作用域
- 函數外部聲明的變量為全局變量,在整個包内都有效,如果變量是(首字元)大寫的,則在整個程式内都有效
- 函數體内的變量為局部變量,隻在函數内有效
- 函數内的語句塊變量(如for循環内部的變量)隻作用于語句塊内
(6)資料類型和操作符
-
6.1、資料類型
- #### 6.1.1、數字資料類型
注意:int8與int16是不同的資料類型:var a int8 、var b int32 = 19 。a和b是不同的資料類型 a=b 是錯誤的,因為資料類型不同
- #### 6.1.1、數字資料類型之間的轉換
轉換格式(參考python的資料類型轉換): <資料類型>(需要轉換的變量)
範例:
var a int var b uint = a = int(b)
-
6.2、操作符
- #### 6.2.1、布爾類型的操作符
- #### 6.2.2、整數類型的操作符
邏輯操作符: == 、!=、<、<=、>和 >=
數學操作符:+、-、*、/等等
(7)字元串類型
go有字元類型,定義字元:var a byte = ‘c’ ,注意值用 ” 号
字元串類型的定義: var str string
-
7.1、字元串拼接
方法一: 可以使用“萬惡的‘+’号”來拼接:
方法二: 利用fmt包的Sprintf格式化輸出來拼接:var a string = "hello" var b string = "jacie" c := a + " " + b
var a string = "hello" var b string = "jacie" c:=fmt.Sprintf("%s %s",a,b)
-
7.2、字元串的切片兒
參考python的切片,十分相似。以 [<開始元素下标>:<結束元素下标>] 來取出部分的元素 ,但是go裡的下标不能為負數
執行結果為var a string = "hello 123 990" a[:] //取出第7到第10個元素(下标從0開始算)
123