iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 9
0
Software Development

學習Go系列 第 9

Go day 9 (bool & string & iota)

bool

bool 只有 true 或 false.go 的 bool 跟數值 0 或 1 沒有間接的轉換,還有邏輯運算子 && 會比 || 先執行.

package main

import (
	"fmt"
)

func main() {
	fmt.Println(checkLetter('A')) // 1
	fmt.Println(checkLetter(5))   // 0
}

func checkLetter(c byte) int {
	if 'a' <= c && c <= 'z' ||
		'A' <= c && c <= 'Z' {
		return 1
	} else {
		return 0
	}
}

string

string 是不可變的一系列位元組.由於不可變所以下面範例的 oldstr 還是原來的值

str := "hello, Daniel"
oldstr := str
str += " World"
fmt.Println(str)    // hello, Daniel World
fmt.Println(oldstr) //hello, Daniel

子字串操作 s[i:j] 從原始字串的索引 i 到 j-1 的位元組.

str := "hello, Daniel"
fmt.Println(len(str))        // 13
fmt.Println(str[0])          // 104
fmt.Println(str[len(str)-1]) // 108
fmt.Println(str[0:5])        // hello
fmt.Println(str[7:])         // Daniel
fmt.Println(str[:])          // hello, Daniel

string 可加入跳脫字元例如要加上雙引號("")、單引號(')、tab(\t)或換行(\n)等... :

fmt.Println("Hello \t \"Daniel\"") // Hello 	 "Daniel"

如果不要有跳脫字元只要保留原始的字串只要使用反引號取代雙引號 :

fmt.Println(`He'l'lo	"Daniel" \t`) // He'l'lo	"Daniel" \t

string 與 int 的轉換

使用 fmt.Sprintf 從 int 轉換成 string

num1 := 12345678
num2 := fmt.Sprintf("%d", num1)
fmt.Println("number is " + num2)

strconv 套件可以在不同進位格式化數字

package main

import (
	"fmt"
	"strconv"
)

func main() {
	num1 := 10
	fmt.Println("number is " + strconv.FormatInt(int64(num1), 10)) // number is 10
	fmt.Println("number is " + strconv.FormatInt(int64(num1), 2))  // number is 1010
	fmt.Println("number is " + strconv.FormatInt(int64(num1), 8))  // number is 12
	fmt.Println("number is " + strconv.FormatInt(int64(num1), 16)) // number is a
}

使用 trconv.Atoi 或 strconv.ParseInt 從 string 轉換成 int

package main

import (
	"fmt"
	"strconv"
)

func main() {
	str1 := "1000"

	i1, err := strconv.Atoi(str1)
	if err == nil {
		fmt.Println(i1 + 10) // 印出 1010
	}

	str2 := "2000"
	i2, err := strconv.ParseInt(str2, 10, 64)
	if err == nil {
		fmt.Println(i2 + 10) // 印出 2010
	}
}

iota 常數產生器

const 常數宣告可以使用 iota 常數產生器,可以產生一系列相關值.iota 值從 0 開始對序列中的每個元素遞增.

package main

import (
	"fmt"
)

type Weekday int

const (
	Sunday Weekday = iota
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)

func main() {
	fmt.Println(Sunday)    // 0
	fmt.Println(Monday)    // 1
	fmt.Println(Tuesday)   // 2
	fmt.Println(Wednesday) // 3
	fmt.Println(Thursday)  // 4
	fmt.Println(Friday)    // 5
	fmt.Println(Saturday)  // 6
}

也可以從 1 開始

type Weekday int

const (
	Sunday Weekday = 1 + iota
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)

func main() {
	fmt.Println(Sunday)    // 1
	fmt.Println(Monday)    // 2
	fmt.Println(Tuesday)   // 3
	fmt.Println(Wednesday) // 4
	fmt.Println(Thursday)  // 5
	fmt.Println(Friday)    // 6
	fmt.Println(Saturday)  // 7
}

透過 << 將每一個值 * 2 遞增

type Weekday int

const (
	Sunday Weekday = 3 << iota
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)

func main() {
	fmt.Println(Sunday)    // 3
	fmt.Println(Monday)    // 6
	fmt.Println(Tuesday)   // 12
	fmt.Println(Wednesday) // 24
	fmt.Println(Thursday)  // 48
	fmt.Println(Friday)    // 96
	fmt.Println(Saturday)  // 192
}


上一篇
Go day 8 (basic types)
下一篇
Go day 10 (Array & slice)
系列文
學習Go30

尚未有邦友留言

立即登入留言