PJCHENder 未整理筆記

[Go] pkg - fmt

2020-06-09

[Go] pkg - fmt

tl;dr

1
2
3
4
5
6
7
8
9
fmt.Printf("%T", "型別")
// %T,型別
// %v,預設的格式
// %+v,印出 struct 時,會多欄位名稱

// %t,boolean
// %s,字串
// %p,記憶體位置(pointer)
// %q,a single-quoted character literal safely escaped with Go syntax.

印出訊息:

1
2
3
4
// 印出訊息
fmt.Print("Hello", "Go") // HelloGo
fmt.Println("Hello", "Go") // Hello Go
fmt.Printf("Hello %s", "Go") // Hello Go

字串:

1
fmt.Sprintf("get form err: %s", err.Error())

Slices:

1
2
3
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

記憶體位置:

1
2
slice := []string{"a", "a"}
fmt.Printf("%p", &slice)

格式

1
2
// %v,印出預設的格式
// %+v,印出 struct 時,會多欄位名稱
1
2
// %s,印出字串
fmt.Printf("Hello %s", "Go") // Hello Go
1
2
// %T,印出變數的型別
fmt.Printf("v is of type %T\n", v)
1
2
3
4
// %g,印出 float64
var v float64 = 10
var lim float64 = 5
fmt.Printf("%g >= %g\n", v, lim)

Functions

FPrint(w io.Writer, a) (n int, err error)

使用預設的 formats 將內容寫到 w 中:

1
2
3
4
5
6
7
8
9
10
func main() {
name := "Aaron"
age := 32

w := os.Stdout

if _, err := fmt.Fprint(w, "Hello ", name, " you are ", age, " years old"); err != nil {
fmt.Println(err)
}
}

輸出內容:

1
Hello Aaron you are 32 years old

Fscan(r, a)

掃描 r 中的內容,並以空格分隔後(換行也算空格),保存到對應的型別中(&i, &b, &s):

1
2
3
4
5
6
7
8
9
10
func main() {
var (
i int
b bool
s string
)
r := strings.NewReader("5 true gophers")
fmt.Fscan(r, &i, &b, &s)
fmt.Println(i, b, s) // 5 true gophers
}

Fscanf(r, format, a)

掃描 r 中文字內容,根據定義的型別(%d %t %s)將 r 中的值取出後,保存到對應型別的變數中(&i, &b, &s):

1
2
3
4
5
6
7
8
9
10
11
// https://pkg.go.dev/fmt?tab=doc#Fscanf
func main() {
var (
i int
b bool
s string
)
r := strings.NewReader("5 true gophers")
fmt.Fscanf(r, "%d %t %s", &i, &b, &s)
fmt.Println(i, b, s) // 5 true gophers
}

Fscanln(r, a)

FscanlnFscan 非常類似,差別只在於 Fscanln 呼叫一次只會讀一行,在呼叫一次才會讀下一行,直到 EOF

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
func main() {
var (
s string
i int
c float64
)
text := `dmr 1771 1.61803398875
ken 271828 3.14159`
r := strings.NewReader(text)

for {
_, err := fmt.Fscanln(r, &s, &i, &c)

if err == io.EOF {
fmt.Println("EOF")
break
}

if err != nil {
if err.Error() == "unexpected newline" {
fmt.Println("unexpected newline")
break
}

panic(err)
}

fmt.Println(s, i, c)
}
}

輸出:

1
2
3
dmr 1771 1.61803398875
ken 271828 3.14159
EOF

其他

fmt 和 log 的差別

When to use log over fmt for debugging and printing error? @ StackOverflow

  • log 使用的是

掃描二維條碼,分享此文章