二、Go 基礎(chǔ)語(yǔ)法

二、Go基礎(chǔ)語(yǔ)法

1.Go語(yǔ)言結(jié)構(gòu)

package main

import "fmt"

func main() {
   /* 這是我的第一個(gè)簡(jiǎn)單的程序 */
   fmt.Println("Hello, World!")
}

僅聲明與其他編程語(yǔ)言不同的點(diǎn)。

  • 第一行代碼 package main 定義了包名。必須在源文件中非注釋的第一行指明這個(gè)文件屬于哪個(gè)包,如:package main。package main表示一個(gè)可獨(dú)立執(zhí)行的程序,每個(gè) Go 應(yīng)用程序都包含一個(gè)名為 main 的包。

  • 當(dāng)標(biāo)識(shí)符(包括常量、變量、類型、函數(shù)名、結(jié)構(gòu)字段等等)以一個(gè)大寫字母開(kāi)頭,如:Group1,那么使用這種形式的標(biāo)識(shí)符的對(duì)象就可以被外部包的代碼所使用(客戶端程序需要先導(dǎo)入這個(gè)包),這被稱為導(dǎo)出(像面向?qū)ο笳Z(yǔ)言中的 public);標(biāo)識(shí)符如果以小寫字母開(kāi)頭,則對(duì)包外是不可見(jiàn)的,但是他們?cè)谡麄€(gè)包的內(nèi)部是可見(jiàn)并且可用的(像面向?qū)ο笳Z(yǔ)言中的 protected )。

  • { 不能單獨(dú)放在一行,否則會(huì)報(bào)錯(cuò)。

2.Go數(shù)據(jù)類型和基礎(chǔ)語(yǔ)法

與其他編程語(yǔ)言幾乎一樣,不展開(kāi)。

3.Go語(yǔ)言變量和常量

變量

共有三種聲明變量的方法。

  1. 指定變量類型,聲明后若不賦值,使用默認(rèn)值。

    var v_name v_type
    v_name = value
    
  2. 根據(jù)值自行判定變量類型

    var v_name = value
    
  3. 省略var, 注意 :=左側(cè)的變量不應(yīng)該是已經(jīng)聲明過(guò)的,否則會(huì)導(dǎo)致編譯錯(cuò)誤。該命名方法只能用在方法內(nèi)。

    func main(){
        a := 10
    }
    

常量

使用const聲明常量。

  • 顯式類型定義: const b string = "abc"
  • 隱式類型定義: const b = "abc"

iota

iota,特殊常量,可以認(rèn)為是一個(gè)可以被編譯器修改的常量。

iota 在 const關(guān)鍵字出現(xiàn)時(shí)將被重置為 0(const 內(nèi)部的第一行之前),const 中每新增一行常量聲明將使 iota 計(jì)數(shù)一次(iota 可理解為 const 語(yǔ)句塊中的行索引)。

iota 可以被用作枚舉值:

package main

import "fmt"

func main() {
    const (
            a = iota   //0
            b          //1
            c          //2
            d = "ha"   //獨(dú)立值,iota += 1
            e          //"ha"   iota += 1
            f = 100    //iota +=1
            g          //100  iota +=1
            h = iota   //7,恢復(fù)計(jì)數(shù)?
            i          //8
    )
    fmt.Println(a,b,c,d,e,f,g,h,i)
}


//輸出結(jié)果為:0 1 2 ha ha 100 100 7 8

4.Go 條件判斷

if語(yǔ)句

與java的條件判斷語(yǔ)句基本相同,但是條件表達(dá)式不需要用 ()。

if 布爾表達(dá)式 {
   /* 在布爾表達(dá)式為 true 時(shí)執(zhí)行 */
}

if 布爾表達(dá)式 {
   /* 在布爾表達(dá)式為 true 時(shí)執(zhí)行 */
} else {
  /* 在布爾表達(dá)式為 false 時(shí)執(zhí)行 */
}

if 布爾表達(dá)式 1 {
   /* 在布爾表達(dá)式 1 為 true 時(shí)執(zhí)行 */
   if 布爾表達(dá)式 2 {
      /* 在布爾表達(dá)式 2 為 true 時(shí)執(zhí)行 */
   }
}

switch

switch 語(yǔ)句用于基于不同條件執(zhí)行不同動(dòng)作,每一個(gè) case 分支都是唯一的,從上直下逐一測(cè)試,直到匹配為止。

一個(gè)case 后面可以跟兩個(gè)條件,用,分割。

switch 語(yǔ)句執(zhí)行的過(guò)程從上至下,直到找到匹配項(xiàng),匹配項(xiàng)后面也不需要再加break。

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}
Type switch

switch 語(yǔ)句還可以被用于 type-switch 來(lái)判斷某個(gè) interface 變量中實(shí)際存儲(chǔ)的變量類型。

package main

import "fmt"

func main() {
   var x interface{}
     
   switch i := x.(type) {
      case nil:      
         fmt.Printf(" x 的類型 :%T",i)                
      case int:      
         fmt.Printf("x 是 int 型")                       
      case float64:
         fmt.Printf("x 是 float64 型")           
      case func(int) float64:
         fmt.Printf("x 是 func(int) 型")                      
      case bool, string:
         fmt.Printf("x 是 bool 或 string 型" )       
      default:
         fmt.Printf("未知型")     
   }   
}

select

select是Go中的一個(gè)控制結(jié)構(gòu),類似于用于通信的switch語(yǔ)句。每個(gè)case必須是一個(gè)通信操作,要么是發(fā)送要么是接收。

select隨機(jī)執(zhí)行一個(gè)可運(yùn)行的case。如果沒(méi)有case可運(yùn)行,它將阻塞,直到有case可運(yùn)行。一個(gè)默認(rèn)的子句應(yīng)該總是可運(yùn)行的。

select {
    case communication clause  :
       statement(s);      
    case communication clause  :
       statement(s); 
    /* 你可以定義任意數(shù)量的 case */
    default : /* 可選 */
       statement(s);
}
  • 每個(gè)case都必須是一個(gè)通信

  • 所有channel表達(dá)式都會(huì)被求值

  • 所有被發(fā)送的表達(dá)式都會(huì)被求值

  • 如果任意某個(gè)通信可以進(jìn)行,它就執(zhí)行;其他被忽略。

  • 如果有多個(gè)case都可以運(yùn)行,Select會(huì)隨機(jī)公平地選出一個(gè)執(zhí)行。其他不會(huì)執(zhí)行。

    否則:

    1. 如果有default子句,則執(zhí)行該語(yǔ)句。
    2. 如果沒(méi)有default字句,select將阻塞,直到某個(gè)通信可以運(yùn)行;Go不會(huì)重新對(duì)channel或值進(jìn)行求值。

5.Go語(yǔ)言循環(huán)

for循環(huán)

主要有3種用法

1.與C語(yǔ)言的for循序一樣:

for init; condition; post { }

for a = 1; a < 100 ; a++{
    //dosomething
}

2.與C語(yǔ)言的while一樣:

for condition { }

for true{
     //dosomething
}

3.和 C 的 for(;;) 一樣:

for {
    //dosomething
}
//跟for true其實(shí)一樣

嵌套循環(huán)的用法與其他語(yǔ)音一樣。

for [condition |  ( init; condition; increment ) | Range]
{
   for [condition |  ( init; condition; increment ) | Range]
   {
      statement(s);
   }
   statement(s);
}

range的用法

類似于Python。

循序控制語(yǔ)句

break

用于循環(huán)語(yǔ)句中跳出循環(huán),并開(kāi)始執(zhí)行循環(huán)之后的語(yǔ)句。

continue

跳過(guò)當(dāng)前循環(huán)執(zhí)行下一次循環(huán)語(yǔ)句。

Go 語(yǔ)言的 goto 語(yǔ)句可以無(wú)條件地轉(zhuǎn)移到過(guò)程中指定的行。

goto語(yǔ)句通常與條件語(yǔ)句配合使用。可用來(lái)實(shí)現(xiàn)條件轉(zhuǎn)移, 構(gòu)成循環(huán),跳出循環(huán)體等功能。

但是,在結(jié)構(gòu)化程序設(shè)計(jì)中一般不主張使用goto語(yǔ)句, 以免造成程序流程的混亂,使理解和調(diào)試程序都產(chǎn)生困難。

package main

import "fmt"

func main() {
   /* 定義局部變量 */
   var a int = 10

   /* 循環(huán) */
   LOOP: for a < 20 {
      if a == 15 {
         /* 跳過(guò)迭代 */
         a = a + 1
         goto LOOP
      }
      fmt.Printf("a的值為 : %d\n", a)
      a++     
   }  
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 函數(shù) Go 語(yǔ)言中,函數(shù)聲明通用語(yǔ)法如下: 函數(shù)的參數(shù)列表定義在 (和) 之間,返回值的類型則定義在之后的 ret...
    kakarotto閱讀 475評(píng)論 0 5
  • 先講一下,寫這種筆記的目的: 自己在學(xué)的過(guò)程中能一字一句讀下來(lái)并且寫出來(lái),便于理解加深記憶,這樣做比只看教程記憶會(huì)...
    kakarotto閱讀 4,414評(píng)論 0 5
  • 第2章 順序編程 2.1 變量 變量聲明 變量聲明的類型信息放在變量之后,放在數(shù)組的中括號(hào)之后,作返回值類型放在方...
    fjxCode閱讀 511評(píng)論 0 1
  • 基本用法包括:變量定義,變量定義要點(diǎn),條件語(yǔ)句,循環(huán),函數(shù)和最重要的指針 一、變量定義 (1)使用var關(guān)鍵字 ...
    小超人愛(ài)小土豆閱讀 143評(píng)論 0 2
  • 關(guān)于信仰! 信仰的海洋紛繁!動(dòng)不動(dòng)信這呢,信那呢,其實(shí)那群人除了趨吉避兇,什么都不相信的! 至于真正的信仰,關(guān)鍵不...
    縱情嬉戲天地間閱讀 210評(píng)論 0 0

友情鏈接更多精彩內(nèi)容