GO入門筆記

deanglc發表於2018-10-31

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.

私有與公共,是以包為單位,==私有是相對兩個包之間==,私有變數在包內,仍然是公共的


複製程式碼

Go有三元表示式?

相關文章