Go學習筆記(2): make a game

來到學習Go 的第二篇文章了,來學習一些控制流以及一些基礎東西吧!

條件式

在 Golang 寫條件式很簡單,就是寫個if 加個大括號就好

 1// 這裡請記得 "{" 和 if 要同一行,之前自由慣了常常被這件事情雷到!
 2if true {
 3    // ......
 4} else if false {
 5    // .....
 6}
 7
 8// 或者你可以使用 if  更短的初始化陳述句
 9if count := 5; count>4 {
10   fmt.Println("count is ",count)
11}

另外有一個比較特別的是,if 區塊裡面的區域變數(使用到:=)是不能使用在if 外面的喔~

請讓我用以下程式碼來做進一步陳述 詳細可以去看 這裏:https://github.com/r567tw/go-practice/blob/master/HelloWorld/if.go

 1package main
 2
 3import (
 4  "fmt"
 5)
 6
 7// var x = 999 // go 裡面也可以宣告一個超越main範圍以外的超全域變數, 但不建議這麼做
 8
 9func main() {
10	fmt.Println("Hello World")
11	x := 10
12
13	if x > 0 {
14		y := 10
15		// x := 100 // 這個等同在裡面宣告新的位置x , 所以外面的x仍然是10
16		x = 100 // 這個會污染外面宣告的x , 所以外面的x 會等於 100
17		fmt.Printf("x = %d\n", x) // x =100
18		fmt.Printf("%d in if statement\n", y) //10 in if statement
19	}
20
21	// fmt.Sprintf("%d out of if statement", y) // error
22	fmt.Printf("x = %d out of if statement\n", x) // x = 100 out of if statement
23}

值得再拿出來說嘴的是,x變數在外面的宣告,如果在if 陳述句範圍裡面使用單純的= ,在main 範圍內的x 是會被更動的,可是如果使用:= , main 裡面的x 不會被影響。

1if number,err := strconv.ParseFloat("3.14",64); err != nil{
2    log.Fatal(err)
3}
4
5fmt.Println(number) // <= 這裡會出現錯誤,因為number 屬於if 區塊裡面的範圍,go 語言的if 裡面變數不得共享

Switch 陳述句

1switch rand.Intn(3)+1 {
2    case 1 : ...
3    case 2 : ...
4    case 3 : ...
5    default : ...
6}

迴圈

話不多說, show you the code

 1for x:= 0; x<=6; x++ {
 2    ......
 3}
 4
 5// 或者只是條件式得處理
 6x:=0
 7for x<=6 {
 8    x++
 9}
10// 迴圈裡面也可以使用 continue 和 break ...

和 if 一樣,使用到:= 所宣告的變數是沒辦法使用在for 外面的。

function

 1package main
 2
 3import (
 4	"fmt"
 5)
 6
 7type bigger = func(int) bool // function 也可以作為型態的一種!
 8
 9func main() {
10	handleFn()
11
12	anonymous := func() {
13		fmt.Println("anonymous function")
14	} // go 也支援匿名funciton
15	anonymous()
16
17	origin := []int{1, 2, 3, 4, 5}
18	change := filter(origin, func(el int) bool {
19		return el > 3
20	})
21	fmt.Println(change)
22}
23
24func handleFn() {
25	fmt.Println("test function")
26}
27
28func filter(data []int, big bigger) []int {
29	filtered := []int{}
30	for _, element := range data {
31		if big(element) {
32			filtered = append(filtered, element)
33		}
34	}
35	return filtered
36}

Make A Game !

接下來,讓我們試著應用以上這些東西,來寫個簡單的猜數字遊戲吧!

 1package main
 2
 3import (
 4	"bufio"
 5	"fmt"
 6	"os"
 7	"math/rand"
 8	"strconv"
 9	"strings"
10	"time"
11)
12
13func main() {
14	r := rand.New(rand.NewSource(time.Now().UnixNano())) // 這一行帶入現在的時間,好讓每一次遊戲隨機產生的數字都不一樣, 原來亂數的原理其實是有一個小技巧和規則的
15	result := r.Intn(100) // 其實這裡可以隨機產生數字
16	
17	loop := true // 設定遊戲開始的條件
18	for (loop) {
19		fmt.Printf("Please Enter a number(1-100): ")
20		reader := bufio.NewReader(os.Stdin) // 其實這裏就是類似Python 的input 而已
21		input, _ := reader.ReadString('\n')
22		number,_ := strconv.Atoi(strings.TrimSpace(input)) // 一定要用trimspace, 否則 strconv轉出來的數字不一定取得出來
23		switch {
24			case (result < number):
25				fmt.Printf("smaller than %d\n",number)
26			case (result > number):
27				fmt.Printf("bigger than %d\n",number)
28			case (result == number):
29				fmt.Println("Bingo")
30				fmt.Printf("result is %d\n",result)
31				loop = false
32				break
33			default:
34				loop = true
35		}
36	}
37
38	fmt.Println("Game is over!")
39}

有興趣看程式碼的可以來這裡:https://github.com/r567tw/go-practice/blob/master/makeGame/main.go

小君曰:猜數字遊戲好像可以作為每個程式語言的入門磚,相對於前端的Todo list 呵呵


Go學習筆記(1): HelloWorld
原來可以這麼寫(12): 我❤️Golang