GO筆記整理
Golang內建關鍵字
//Go內建關鍵字(25個均為小寫)
/*
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var */
"內建函式名也不能用於變數宣告"
複製程式碼
Go程式的一般結構
-
Go程式是通過 package 來組織的(與python類似)
-
只有 package 名稱為 main 的包可以包含 main 函式
-
一個可執行程式 有且僅有 一個 main 包
-
通過 ==import== 關鍵字來匯入其它非 main 包
-
通過 ==const== 關鍵字來進行常量的定義
-
通過在函式體外部使用 ==var== 關鍵字來進行全域性變數的宣告與賦值
-
通過 ==type== 關鍵字來進行==結構(struct)==或==介面(interface)==的宣告
-
通過 ==func== 關鍵字來進行函式的宣告
GO的資料型別彙總給
int,float uint complex bool //足夠儲存指標的 32 位或 64 位整數型:uintptr
array struct string
slice map chan
interface
func
複製程式碼
###變數
// 宣告變數的三種方式
var str string = "I am Dean" // 變數名 變數型別 = 值
var str = "I am Dean" // 自行判斷型別
str := "I am Dean" // 最簡便寫法,===>> 不可用於宣告全域性變數
/*其他需要注意的=+++++++++++++++++++++++++++++++++++++++++++++*/
var ( // 全域性變數宣告必須使用var關鍵字
a = 1
b,c = 2,3 // 並行宣告變數
)
var a,b,c,d int //如沒有賦值,則取初始值 數字=0 bool=false string=''
// ===================================================================
/*1==>GO中不存在隱式轉換,所有型別轉換必須顯式宣告
2==>轉換隻發生在兩種相互相容的型別之間
3==>型別轉換的格式: <ValueA>[:] = <TypeOfValueA>(<ValueB>)
*/
a:=1.1
b:=int(a)
fmt.Println(b)
// 下面的會報錯 cannot convert c (type bool) to type int
c:=true
d:=int(c)
fmt.Println(d)
// 測試以下程式碼列印的值
var aa int = 66
bb := string(aa)
fmt.Println(bb)
複製程式碼
常量
- 常量的值在編譯的時候就已確定 不可更改
- 常量定義格式基本與變數相同
- 等號右側必須是常量或者是常量表示式
- 常量表示式中的函式必須是==內建函式==
const a int = 1
const b = 'A'
const (
text = '123'
length = len(text)
num = b*20
)
// iota是常量的計數器,從0開始,組中每定義一個常量自動遞增1
// 但沒遇到一個const關鍵字,iota就會歸零
const (
aa = iota
a = 1
b
c = iota
d = iota
)
const (
Monday = iota
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
)
// 預測 aa,a,b,c,d的值 分析出要點
func main() {
fmt.Println(aa,a,b,c,d)
}
複製程式碼
運算子
運算子
Go中的運算子均是從左至右結合
優先順序(從高到低)
^ ! (一元運算子)
* / % << >> & &^
+ - | ^ (二元運算子)
== != < <= >= >
<- // (專門用於channel)
&&
||
複製程式碼
資料型別
//float32 float64
// uint8 / int8
// bool
// byte (uint8別名)
// int/uint
複製程式碼
結構struct
type jiegou struct {
name string
age int
}
// 匿名結構
func main() {
a := &struct {
Name string
Age int
}{
Name: "dean",
Age:19,
}
}
// 匿名結構
type person struct {
Name string
Age int
Contact struct {
Phone,City string
}
}
func main() {
a := person{Name: "dean",Age:19}
a.Contact.Phone = "13356424532"
a.Contact.City = "ruishi"
}
//匿名欄位 靠順序對應欄位型別
type person struct {
string
int
}
func main() {
a:= person{"joe", 19}
fmt.Pringln(a)
}
複製程式碼
method(類似於class的def)
概念:method是附屬在一個給定的型別上,語法和函式的宣告幾乎一樣,只是func後面增加了一個recvier(這個def給哪個class的意思)
//格式
func (r ReveiverType) funcName(parameters) (results){
//
}
//示例1
func main() {
r1 := Rectangle{12,2}
r1.area()
}
type Rectangle struct {
width, height float64
}
func (r Rectangle) area() float64 {
return r.width * r.height
}
//示例2
func main() {
a:=A{}
a.Print()
fmt.Println(a.Name)
b:=B{}
b.Print()
fmt.Println(b.Name)
} // 輸出結果是 A AA B 這是指標和無指標的對比
type A struct {
Name string
}
type B struct {
Name string
}
func (a *A) Print() {
a.Name="AA"
fmt.Pringln("A")
}
func (b B) Print() {
a.Name="BB"
fmt.Pringln("B")
}
// 示例3
type TZ int
func main() {
var a TZ
a.Print() //輸出TZ
(*TZ).Print(&a) // 同樣可以輸出TZ
}
func (a *TZ) Print() {
fmt.Pringln("TZ")
}
複製程式碼
介面interface
type Shaper interface {
Area() float32
}
type Square struct{
side float32
}
func (sq *Square) Area() float32 {
return sq.side * sq.side
}
func main() {
sq1 := new(Square)
sq1.side = 5
var areaIntf Shaper
areaIntf = sq1
//使用 型別斷言 來測試在某個時刻 varI 是否包含型別 T 的值
if t,ok := areaIntf.(*Square); ok{ // t,ok := 介面變數.(*某個型別)
fmt.Println(t,ok)
fmt.Printf("The type of areaIntf is :%T\n", t)
}
}
複製程式碼
函式
Go語言中,使用 大小寫 來決定該 常量、變數、型別、介面、結構或函式 是否可以被外部包所呼叫:
根據約定,函式名首字母 小寫 即為private 大寫為public.
私有與公共,是以包為單位,==私有是相對兩個包之間==,私有變數在包內,仍然是公共的
複製程式碼