1. 程式人生 > 其它 >GO語言的基本語法之變數,常量,條件語句,迴圈語句

GO語言的基本語法之變數,常量,條件語句,迴圈語句

GO語言的基本語法之變數,常量,條件語句,迴圈語句

作為慕課網得筆記自己看

定義變數:

使用var關鍵字

  • var a, b, C bool
  • var s1, s2 string = "hello", "world'
  • 可放在函式內,或直接放在包內
  • 使用var()集中定義變數

讓編譯器自動決定型別

  • vara,b,i,s1, s2 = true, false, 3, "hello", "world"

使用:=定義變數

  • a,b,i,s1, s2:= true, false, 3, "hello", "world"
  • 只能在函式內使用

內建變數型別:

  • bool, string就是正常的布林和string
  • (u)int, (u)int8, (u)int16, (u)int32, (u)int64, 加個u就是無符號整數,不加u就是有符號整數
  • 有符號整數還分為兩類,一種規定長度,一種沒規定長度,沒規定長度的跟著作業系統走
  • uintptr就是指標,長度一樣是跟著作業系統來的
  • byte, rune ,其中的rune就是字元型,就是GO語言的char型別,32位
  • float32, float64, complex64, complex128,浮點數型別,這個complex是複數,就是帶有實部和虛部的那個

強制型別轉換:

只有強制的型別轉換

常量定義:

  • const filename = "abc.txt"
  • const 數值可作為各種型別使用
  • consta,b=3,4
  • var C int = int(math.Sqrt(a*a + b * b))

還有特殊的常量,列舉型別

  • 普通的列舉型別
  • 自增值的列舉型別

示例程式碼如下:

package main

import (
   "fmt"
   "math"
   "math/cmplx"
)
//函式外面定義變數,不能使用:=
//這樣的全部都是包內的變數,不是全域性變數
var (
   aa = 3
   ss = "kkk"
   bb = true
)
//這裡是用函式定義一個變數
func variableZeroValue() {
   var a int
   var s string
   fmt.Printf("%d %q\n", a, s)
}
//這裡是賦上初值,PS:定義了就必須要用
func variableInitialValue() {
   var a, b int = 3, 4
   var s string = "abc"
   fmt.Println(a, b, s)
}
//省略型別名,自動辨識初值,不是一個型別也可以寫在一行
func variableTypeDeduction() {
   var a, b, c, s = 3, 4, true, "def"
   fmt.Println(a, b, c, s)
}
//省略var,使用:=和使用var是一樣的
//第一次必須要使用:=,後面就還要用=,不需要再用:=
func variableShorter() {
   a, b, c, s := 3, 4, true, "def"
   b = 5
   fmt.Println(a, b, c, s)
}
//尤拉公式
func euler() {
   fmt.Printf("%.3f\n",
      cmplx.Exp(1i*math.Pi)+1)
}
//強制型別轉換
func triangle() {
   var a, b int = 3, 4
   fmt.Println(calcTriangle(a, b))
}
//強制型別轉換
func calcTriangle(a, b int) int {
   var c int
   c = int(math.Sqrt(float64(a*a + b*b)))
   return c
}
//設定常量
func consts() {
   const (
      filename = "abc.txt"
      a, b     = 3, 4
   )
   var c int
   c = int(math.Sqrt(a*a + b*b))
   fmt.Println(filename, c)
}
//特殊常量:列舉型別
func enums() {
   const (
      cpp = iota//iota表示自增值
      _
      python
      golang
      javascript
   )

   const (
      b = 1 << (10 * iota)
      kb
      mb
      gb
      tb
      pb
   )

   fmt.Println(cpp, javascript, python, golang)
   fmt.Println(b, kb, mb, gb, tb, pb)
}

func main() {
   fmt.Println("Hello world")
   variableZeroValue()
   variableInitialValue()
   variableTypeDeduction()
   variableShorter()
   fmt.Println(aa, ss, bb)

   euler()
   triangle()
   consts()
   enums()
}

變數定義要點:

  • 變數型別寫在變數名之後
  • 編譯器可推測變數型別
  • 沒有char ,只有rune
  • 原生支援複數型別

條件語句:

if:

  • if的條件不需要括號括起來
  • if的條件裡可以賦值
  • if的條件裡賦值的變數作用域就在這個if語句中

switch:

  • switch會自動break,除非使用fallthrough
  • switch後面可以不帶表示式

示例程式碼如下:

package main

import (
   "fmt"
   "io/ioutil"
)

//switch函式用法
func grade(score int) string {
   g := ""
   switch {
   case score < 0 || score > 100:
      panic(fmt.Sprintf(
         "Wrong score: %d", score))
   case score < 60:
      g = "F"
   case score < 80:
      g = "C"
   case score < 90:
      g = "B"
   case score <= 100:
      g = "A"
   }
   return g
}

func main() {
   // If "abc.txt" is not found,
   // please check what current directory is,
   // and change filename accordingly.
   const filename = "abc.txt"
   //ioutil.ReadFile讀出abc.txt的內容
   if contents, err := ioutil.ReadFile(filename); err != nil {
      fmt.Println(err)
   } else {
      fmt.Printf("%s\n", contents)
   }

   fmt.Println(
      grade(0),
      grade(59),
      grade(60),
      grade(82),
      grade(99),
      grade(100),
      // Uncomment to see it panics.
      // grade(-3),
   )
}

迴圈語句:

for:

  • for的條件裡不需要括號
  • for的條件裡可以省略初始條件,結束條件,遞增表示式
  • 可以省略初始條件,相當於while
  • 什麼都省略的情況為死迴圈

示例程式碼如下:

package main

import (
   "bufio"
   "fmt"
   "io"
   "os"
   "strconv"
   "strings"
)

//將整數轉換為二進位制表示式
func convertToBin(n int) string {
   result := ""
   for ; n > 0; n /= 2 {
      lsb := n % 2
      //strconv.Itoa變為字串
      result = strconv.Itoa(lsb) + result
   }
   return result
}
//讀取檔案
func printFile(filename string) {
   file, err := os.Open(filename)
   if err != nil {
      panic(err)
   }

   printFileContents(file)
}
//讀取檔案內容
func printFileContents(reader io.Reader) {
   scanner := bufio.NewScanner(reader)

   for scanner.Scan() {
      fmt.Println(scanner.Text())
   }
}
//死迴圈
func forever() {
   for {
      fmt.Println("abc")
   }
}

func main() {
   fmt.Println("convertToBin results:")
   fmt.Println(
      convertToBin(5),  // 101
      convertToBin(13), // 1101
      convertToBin(72387885),
      convertToBin(0),
   )

   fmt.Println("abc.txt contents:")
   printFile("lang/basic/branch/abc.txt")

   fmt.Println("printing a string:")
   s := `abc"d"
   kkkk
   123

   p`
   printFileContents(strings.NewReader(s))

   // Uncomment to see it runs forever
   // forever()
}

基本語法要點:

  • for, if後面的條件沒有括號
  • if 條件裡也可定義變數
  • 沒有while
  • switch不需要break ,也可以直接switch多個條件
感謝觀看,文筆有限,部落格不出彩,還請多多見諒