天天看點

【《Go語言程式設計》學習筆記(一)順序程式設計】變量、常量、類型、Map

學習頁碼:32-52頁 | 學習頁數:20頁 | 學習時間:5.5h

一、變量(variables.go)

package main

func main() {
   //1.變量聲明
   var v1 int
   var v2 string
   var v3 [10]int
   var v4 []int
   var v5 map[string]int
   var v6 struct {
      f int
   }
   var v7 *int
   var v8 func(a int) int

   var (
      v9  int
      v10 [5]int
   )

   //2.變量初始化
   var v11 int = 1
   var v12 = 1
   v13 := 1

   //3.變量指派
   var v14 int
   v14 = 1
   //1>多重指派
   var i int = 1
   var j int = 2
   i, j = j, i

   //4.匿名變量
   _, _, nickName := GetName()
}

func GetName() (firstName, lastName, nickName string) {
   return "May", "Chan", "Chibi Maruko"
}      

二、常量(const.go)

package main

import "fmt"

//import "os"

func main() {
   //1.字面常量
   //2.常量定義
   const PI float32 = 3.1415926
   const P = 1
   const (
      AA int64 = 1024
      BB int   = 2
   )
   const A, B, C = 1, 2, "abc"
   //const D = os.Getenv("HOME") // const initializer os.Getenv("HOME") is not a constant

   fmt.Println(A, B, C)
   //3.預定義常量
   const (
      A1 = iota
      A2 = iota
      A3 = iota
   )
   const (
      B1 = iota
      B2
      B3
   )
   fmt.Println(A3, B3)
}      
package main

import (
   "fmt"
   "math"
)

func main() {

   //1.布爾類型
   var a1 bool
   a1 = true
   a2 := (1 == 1)
   var a3 bool
   //a3 = 1 //cannot use 1 (type int) as type bool in assignment
   fmt.Println(a1, a2, a3)

   //2.整數類型
   //1>類型表示
   var b1 int32 //b1 declared and not used
   b2 := 24
   b1 = int32(b2) //cannot use b2 (type int) as type int32 in assignment
   //2>數值運算 +、 、*、/和%
   b1 = 5 % 2
   fmt.Println(b1)
   //3>比較運算 >、<、==、>=、<=和!=
   //4>邏輯運算 x << y 左移 x >> y 右移  x^y 異或 x&y 與 x|y 或 ^x 取反

   //3.浮點數
   //1>浮點數表示
   var c1 float32
   c2 := 12.0
   c1 = float32(c2) //cannot use c2 (type float64) as type float32 in assignment
   fmt.Println(c1, c2)
   //2>浮點數比較
   var (
      c3 float64 = 12.1
      c4 float64 = 12.0
   )
   rs := isEqual(c3, c4, 0.001)
   fmt.Println(rs)

   //4.複數
   //1>複數表示
   var d1 complex64
   d1 = 12 + 12i
   d2 := 12 + 12i
   d3 := complex(12, 12)
   fmt.Println(d1, d2, d3)

   //5.字元串
   var str string
   str = "Hello world"
   ch := str[0]
   fmt.Printf("The length of \"%s\" is %d \n", str, len(str))
   fmt.Printf("The first character of \"%s\" is %c.\n", str, ch)
   //1>字元串操作
   var (
      x string = "Hello"
      y string = "123"
   )
   fmt.Printf("字元串連接配接\"%s\",字元串長度\"%s\",取字元\"%s\" \n", x+y, len(x), x[1])
   //2>字元串周遊
   n_str := "Hello,世界"
   n := len(n_str)
   for i := 0; i < n; i++ {
      ch := n_str[i] //          的     為byte
      fmt.Println(i, ch)
   }
   for i, ch := range n_str {
      fmt.Println(i, ch) //ch的  為rune
   }

   //6.字元類型
   var e1 byte
   var e2 rune
   fmt.Println(e1, e2)

   //7.數組
   //1>數組聲明
   var f1 [32]float32
   var f2 [2 * 2]int
   var f3 [10]*float64
   var f4 [2][2]int
   fmt.Println(f1, f2, f3, f4)
   //2>數組周遊
   for i := 0; i < len(f2); i++ {
      fmt.Println("Element", i, "of array is", f2[i])
   }
   for i, v := range f2 {
      fmt.Println("Array element[", i, "]=", v)
   }
   //3>值類型
   f5 := [5]int{1, 2, 3, 4, 5} // annot use f5 (type [5]int) as type [10]int in argument to modify
   modify(f5)
   fmt.Println("In main(), array values:", f5)

   //8.數組切片
   //1>建立數組切片 基于數組或直接建立
   var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
   var mySlice []int = myArray[:5] // myArray[:]所有 myArray[5:]從第5個開始 myArray[:5]前5個
   fmt.Println("Elements of myArray: ")
   for _, v := range myArray {
      fmt.Print(v, " ")
   }
   fmt.Println("\nElements of mySlice: ")
   for _, v := range mySlice {
      fmt.Print(v, " ")
   }
   //建立一個初始元素個數為5的數組切片,元素初始值為0:
   mySlice1 := make([]int, 5)
   //建立一個初始元素個數為5的數組切片,元素初始值為0,并預留10個元素的存儲空間:
   mySlice2 := make([]int, 5, 10)
   //直接建立并初始化包含5個元素的數組切片:
   mySlice3 := []int{1, 2, 3, 4, 5}
   fmt.Println("\n", len(mySlice1), len(mySlice2), len(mySlice3))
   //2>元素周遊
   //3>動态增減元素
   mySlice4 := make([]int, 5, 10)
   mySlice4 = append(mySlice4, 1, 2, 3)
   mySlice4 = append(mySlice4, mySlice1...)
   fmt.Println("len(mySlice4):", len(mySlice4))
   fmt.Println("cap(mySlice4):", cap(mySlice4))
   //4>基于數組切片建立數組切片
   oldSlice := []int{1, 2, 3, 4, 5}
   newSlice := oldSlice[:3]
   for _, v := range newSlice {
      fmt.Println("前三個元素", v)
   }
   //5>内容複制
   slice1 := []int{1, 2, 3, 4, 5}
   slice2 := []int{5, 4, 3}
   copy(slice2, slice1)
   for _, v := range slice2 {
      fmt.Println("slice2", v)
   }
   slice1 = []int{1, 2, 3, 4, 5}
   slice2 = []int{5, 4, 3}
   copy(slice1, slice2)
   for _, v := range slice1 {
      fmt.Println("slice1", v)
   }
}

func modify(array [5]int) {
   array[0] = 10
   fmt.Println("In modify(), array values:", array)
}

func isEqual(f1, f2, p float64) bool {
   return math.Dim(f1, f2) < p
}      
package main

import "fmt"

type PersonInfo struct {
   ID      string
   Name    string
   Address string
}

func main() {
   //1.變量聲明 personDB代表變量名 string代表鍵類型 PersonInfo代表值類型
   var personDB map[string]PersonInfo
   //2.建立,可指定存儲能力
   personDB = make(map[string]PersonInfo, 20)
   //建立并初始化
   personDB2 := map[string]PersonInfo{"1234": PersonInfo{"1234", "tom", "room"}}
   //3.元素指派
   personDB["12345"] = PersonInfo{"12345", "Tom", "Room 203,..."}
   personDB["1"] = PersonInfo{"1", "Jack", "Room 101,..."}
   //4.元素删除
   delete(personDB2, "1")
   //5.元素查找
   person, ok := personDB["1234"]
   if ok {
      fmt.Println("Found person", person.Name, "with ID 1234.")
   } else {
      fmt.Println("Did not find person with ID 1234.")
   }
}