在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ GO/ 基本語法
面向?qū)ο?/span>
Go 語言簡介
網(wǎng)頁下載
聊天室的開發(fā)
image 網(wǎng)站開發(fā)
基本語法
高級應(yīng)用

基本語法

學(xué)習(xí)一門新的語言無非就是從基本的語法開始的。通過語法書來學(xué)習(xí)語言畢竟是非??菰锏?,所以我們不妨從最簡單的例子開始學(xué)習(xí)一門新的語言。例子不多,但是有代表性。

數(shù)據(jù)類型

  • var varName type,var var1,var2… type,var varName type = Value,var varName1,varName2 type - Value1,Value2,var varName1,varName2=Value1,Value2,varName1,varName2:=Value1,Value2,定義數(shù)據(jù)類型。
  • 聲明了沒有被使用的變量將在編譯時報(bào)錯。
  • 常量定義: const varName = Value , const varName type = Value
  • string 字符串類型值不可改變,但是可以切片,字符串可以使用+進(jìn)行連接
  • iota 用來聲明 enum,表示自加 1,初始為 0
  • var arrayName [N]type用來聲明數(shù)組,或者使用 arrayName := [N]type{ v1,v2…}來聲明
  • 數(shù)組聲明可以嵌套
  • slice 用來表示切片,聲明方式 var sliceName []type 或者 sliceName := []type{v1,v2…}
  • slice 保存的是引用而非實(shí)體
  • 在 slice 中有一些內(nèi)置函數(shù),len 獲取長度,cap 獲取最大容量,append 追加數(shù)據(jù),copy 用來拷貝數(shù)據(jù)
  • map聲明方式為var mapName map[keyType] valueType或者mapName := make(map[keyType]valueType)
  • map可通過 key : value 初始化
  • make用于內(nèi)建類型的內(nèi)存分配,new 用于各種類型的內(nèi)存分配,new 返回指針而 make 返回非 0 的值

流程控制

  • if 語句不需要括號,在 if 語句中可以聲明變量,用分好分割 if 語句的條件判斷。
  if x:=function();x<10 {
      fmt.Printf("x < 10,%d\n",x);
  }else{
      fmt.Print("x >= 10 ,%d\n",x);
  }
  • goto 語句類似 C 語言,但是跳轉(zhuǎn)到必須在當(dāng)前函數(shù)內(nèi)定義的標(biāo)簽。
  • for 語句類似 C 語言,但是 break 和 continue 可以跟標(biāo)號,跳出多重循環(huán)。
  • switch 語句不用 break,如果想強(qiáng)行執(zhí)行下面的 case 可以使用 fallthrough。

函數(shù)

聲明方式:

func funcName(input1 type1, input2 type2) (output1 type1, output2 type2)
  • func 用來聲明函數(shù),函數(shù)名為 funcName,后面跟輸入,輸出的數(shù)據(jù)類型。
  • 函數(shù)可以有多個返回值
  • 函數(shù)的值操作和指針操作類似 C 語言,內(nèi)置類型中的 string,slice,map 直接使用的是類似的指針傳遞,不用使用取地址符,但是,如果需要改變 slice 的長度,則需要取地址穿指針。
  • defer 語句用來表示在函數(shù)返回前執(zhí)行的語句。
  • type typeName func(input1 inputType1 , input2 inputType2 [, ...]) (result1 resultType1 [, ...])用來聲明一個函數(shù)類型,主要用于高階函數(shù)中。
  • import 用來導(dǎo)入包,package 用來導(dǎo)出包,包操作使用.操作符

Struct 類型

  • 聲明方式:
type Person struct {
  name string
  age int
  }
  • 匿名方式,匿名方式下A含有B的所有類型
type Student struct {
  Person  // 默認(rèn)Person的所有字段
  speciality string
  }
  • 如果匿名類型中有字段和本身有沖突,可以使用匿名類型+.訪問
  • 類型的方法聲明: func (r ReceiverType) funcName(parameters) (results)
  • 可以使用:type typeName typeLiteral 來自定義類型,定義完以后可以使用方法來擴(kuò)展類型的功能。
  • 需要改變 struct 內(nèi)部的值時,需要將 ReceiverType 定義為*指針類型,但是調(diào)用的時候不需要,Go 語言自動幫你完成了。
  • 方法可以繼承,可以重載。

interface 接口

  • type InterfaceName interface 用來定義 inerface。
  • interface 類型定義了一組方法,如果某個對象實(shí)現(xiàn)了某個接口的所有方法,則此對象就實(shí)現(xiàn)了此接口。
  • 空 interface(interface{})不包含任何的 method,正因?yàn)槿绱?,所有的類型都?shí)現(xiàn)了空 interface。
  • 一個函數(shù)把interface{}作為參數(shù),那么他可以接受任意類型的值作為參數(shù),如果一個函數(shù)返回interface{},那么也就可以返回任意類型的值。
  • value, ok = element.(T),這里 value 就是變量的值,ok 是一個 bool 類型,element 是 interface 變量,T 是斷言的類型,如果 ok 為 true 則表示,element 確實(shí)是 T 類型的。
  • interface 可以嵌套。

并發(fā)

  • 使用 go 關(guān)鍵字+函數(shù)名實(shí)現(xiàn)并發(fā)
  • 使用 channel 實(shí)現(xiàn)線程間通訊,channel 通過 make 構(gòu)造,使用<-來發(fā)送和接受數(shù)據(jù)。
  • chan 是channel 的關(guān)鍵字,后面跟數(shù)據(jù)類型ch <- v發(fā)送數(shù)據(jù),v:=<-ch接收數(shù)據(jù),ch 是 chan 類型。
package main
  import "fmt"
  func sum(a []int, c chan int) {
      total := 0
      for _, v := range a {
          total += v
      }
      c <- total  // send total to c
  }

  func main() {
      a := []int{7, 2, 8, -9, 4, 0}
      c := make(chan int)
      go sum(a[:len(a)/2], c)
      go sum(a[len(a)/2:], c)
      x, y := <-c, <-c  // receive from c
      fmt.Println(x, y, x + y)
  }
  • channel 默認(rèn)是阻塞形式的,可以進(jìn)行線程同步。
  • ch := make(chan type, value)構(gòu)造 channel 時可通過設(shè)置不同的 value 來設(shè)定 channl 的 buffer 長度。
  • close 用來關(guān)閉 channel。
  • 使用select+case來選擇多個 channel。
  • 使用select + case <- time.After(5 * time.Second)來設(shè)定超時。
  • Goexit 退出當(dāng)前執(zhí)行的 goroutine,但是 defer 函數(shù)還會繼續(xù)調(diào)用。
  • Gosched 讓出當(dāng)前 goroutine 的執(zhí)行權(quán)限,調(diào)度器安排其他等待的任務(wù)運(yùn)行,并在下次某個時候從該位置恢復(fù)執(zhí)行。
  • NumCPU 返回 CPU 核數(shù)量。
  • NumGoroutine 返回正在執(zhí)?行和排隊(duì)的任務(wù)總數(shù)。
  • GOMAXPROCS 用來設(shè)置可以運(yùn)行的 CPU 核數(shù)。

示例

(a)最簡單的代碼

package main  

import "fmt"  

func main() {  

        fmt.Println("hello, world")  
}  

(b)基本的函數(shù)

package main  

import "fmt"  

func sub(a int, b int) int {  

        return a - b;  
}  

func main() {  

        fmt.Println(sub(2, 3))  
}  

(c)if 語句學(xué)習(xí)

package main  

import "fmt"  

func compare(a int, b int) {  

        if(a > b) {  
                fmt.Println("greater")  
        }else{  
                fmt.Println("smaller")  
        }  
}  

func main() {  

        compare(3, 2)  
}  

(d)switch 語句學(xué)習(xí)

package main  

import "fmt"  

func test(a int) {  

        switch (a) {  

                case 1:  
                        fmt.Println("1")  

                case 2:  
                        fmt.Println("2")  

                default:  
                        fmt.Println("error")  

        }  

}  

func main() {  

        test(1)  
        test(2)  
        test(3)  
}  

(e)循環(huán)語句學(xué)習(xí)

package main  

import "fmt"  

func show(data int) {  

        var index int  
        index = 0  

        for {  

                if(index >= data) {  

                        break  
                }  

                fmt.Println(index)  
                index ++  
                continue  

        }  
}  

func main() {  

        show(10)  
}  

(f)結(jié)構(gòu)體學(xué)習(xí)

package main  

import "fmt"  

type node struct {  

        data int  

}  

func(p* node)set(val int)() {  

        p.data = val  
}  

func(p* node)get() int {  

        return p.data;  
}  

func main() {  

        n := node{data: 10}  

        m := &n  
        m.set(12)  
        fmt.Println(m.get())  
}