go語言的官網訪問不了,建議使用國內的鏡像下載。
一、基本數據類型和操作符
(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 = 19 //聲明變量初始化
func init() { //自執行函數
Name = "Lin"
age = 16
}
/*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包小寫變量無法調用
執行結果
Lin
(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 = 1 //定義一個常量
b= "ppap" //定義一個常量
c=10 //定義一個常量
)
定義常量可以不需要聲明類型
5.2、變量的定義
格式: ==var <變量名> [type]==
5.3、變量的賦值
方法一: 在定義變量時,初始化變量:
var number_a int = 19
#更專業的初始化方法:
var (
a int
b int
c string
d bool
e = 67
f ="app"
)
方法二: 定義變量後,賦值:
var number_a int
number_a = 19
1
2
方法三: 使用 :=符號,自動推導變量類型:
number_a := 19
1
方法三相當於方法二,但是與方法一有本質區別,方法一稱爲初始化。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、數字數據類型
數字類型,主要有int、int8、int16、int32、int64、uint8、uint16、uint32、uint64、loat32、float64
注意:int8與int16是不同的數據類型:var a int8 、var b int32 = 19 。a和b是不同的數據類型 a=b 是錯誤的,因爲數據類型不同
#### 6.1.1、數字數據類型之間的轉換
轉換格式(參考python的數據類型轉換): <數據類型>(需要轉換的變量)
範例:
var a int
var b uint 32 = 100
a = int(b)
6.2、操作符
#### 6.2.1、布爾類型的操作符
布爾類型的操作符有: * !、&&、|| *
#### 6.2.2、整數類型的操作符
邏輯操作符: == 、!=、<、<=、>和 >=
數學操作符:+、-、*、/等等
(7)字符串類型
go有字符類型,定義字符:var a byte = ‘c’ ,注意值用 ” 號
字符串類型的定義: var str string
7.1、字符串拼接
方法一: 可以使用“萬惡的‘+’號”來拼接:
var a string = "hello"
var b string = "jacie"
c := a + " " + b
方法二: 利用fmt包的Sprintf格式化輸出來拼接:
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[6:9] //取出第7到第10個元素(下標從0開始算)
執行結果爲 123