文章目錄
- 一、打印Print
- 1.1 fmt.Print 和 fmt.Println
- 1.2fmt.Printf
- 1.3 fmt.Sprint, fmt.Sprintf, 和 fmt.Sprintln
- 1.4 fmt.Fprint, fmt.Fprintf, 和 fmt.Fprintln
- 二、打印格式
- 基本格式動詞
- 整數類型
- 浮點數和復數類型
- 字符串和字節切片
- 布爾類型
- 指針
一、打印Print
Go 語言的 fmt 包提供了多種打印函數,用于格式化和輸出數據。以下是幾個常用的 fmt 打印函數及其區別:
- fmt.Print 和 fmt.Println
- fmt.Printf
- fmt.Sprint, fmt.Sprintf, 和 fmt.Sprintln
- fmt.Fprint, fmt.Fprintf, 和 fmt.Fprintln
1.1 fmt.Print 和 fmt.Println
fmt.Print:將參數打印到標準輸出,不附加任何額外的字符。
fmt.Println:將參數打印到標準輸出,并在末尾附加一個換行符。
示例:
package main
import "fmt"func main() {fmt.Print("Hello, ")fmt.Print("World!")// 輸出: Hello, World!fmt.Println("Hello, ")fmt.Println("World!")// 輸出:// Hello,// World!
}
1.2fmt.Printf
fmt.Printf:根據格式字符串格式化并打印參數。格式字符串可以包含格式動詞,例如 %d 表示整數,%s 表示字符串,%v 表示默認格式等。
示例:
package mainimport "fmt"func main() {name := "Alice"age := 30fmt.Printf("Name: %s, Age: %d\n", name, age)// 輸出: Name: Alice, Age: 30
}
1.3 fmt.Sprint, fmt.Sprintf, 和 fmt.Sprintln
這些函數類似于 fmt.Print, fmt.Printf, 和 fmt.Println,但它們將結果返回為字符串,而不是直接打印到標準輸出。
fmt.Sprint:返回格式化后的字符串。
fmt.Sprintf:根據格式字符串返回格式化后的字符串。
fmt.Sprintln:返回格式化后的字符串,并在末尾附加一個換行符。
示例:
package mainimport "fmt"func main() {str := fmt.Sprint("Hello, ", "World!")fmt.Println(str)// 輸出: Hello, World!str = fmt.Sprintf("Name: %s, Age: %d", "Alice", 30)fmt.Println(str)// 輸出: Name: Alice, Age: 30str = fmt.Sprintln("Hello, ", "World!")fmt.Println(str)// 輸出: Hello, World!// (注意末尾的空行)
}
1.4 fmt.Fprint, fmt.Fprintf, 和 fmt.Fprintln
這些函數類似于 fmt.Print, fmt.Printf, 和 fmt.Println,但它們將結果輸出到指定的 io.Writer(例如文件或網絡連接)。
fmt.Fprint:將格式化后的輸出寫入 io.Writer。
fmt.Fprintf:根據格式字符串將格式化后的輸出寫入 io.Writer。
fmt.Fprintln:將格式化后的輸出寫入 io.Writer,并在末尾附加一個換行符。
示例:
package mainimport ("fmt""os"
)func main() {f, err := os.Create("output.txt")if err != nil {fmt.Println(err)return}defer f.Close()fmt.Fprint(f, "Hello, ")fmt.Fprintln(f, "World!")fmt.Fprintf(f, "Name: %s, Age: %d\n", "Alice", 30)
}
上面的代碼會在當前目錄下創建一個名為 output.txt 的文件,并將以下內容寫入其中:
Hello, World!
Name: Alice, Age: 30
總結
fmt.Print 和 fmt.Println:直接將參數打印到標準輸出。
fmt.Printf:根據格式字符串格式化并打印參數到標準輸出。
fmt.Sprint, fmt.Sprintf, 和 fmt.Sprintln:返回格式化后的字符串,不直接打印。
fmt.Fprint, fmt.Fprintf, 和 fmt.Fprintln:將格式化后的輸出寫入指定的 io.Writer。
二、打印格式
在 Go 語言的 fmt 包中,格式動詞(format verbs)用于控制字符串的格式化輸出。不同的格式動詞可以用于不同類型的數據,提供多種顯示選項。以下是一些常見的格式動詞及其含義:
基本格式動詞
%v:默認格式輸出。
%+v:結構體字段名和值一起輸出。
%#v:Go 語言語法格式輸出(即,可以直接用作 Go 代碼的輸出)。
%T:輸出值的類型。
%%:字面上的百分號。
整數類型
%b:二進制表示。
%c:相應 Unicode 碼點的字符。
%d:十進制表示。
%o:八進制表示。
%O:帶零前綴的八進制表示(0o123)。
%x:十六進制表示,小寫字母。
%X:十六進制表示,大寫字母。
%U:Unicode 格式:U+1234。
%q:單引號圍繞的字符字面值,必要時會采用轉義表示。
浮點數和復數類型
%b:無小數部分的科學計數法,例如 -123456p-78。
%e:科學計數法,例如 -1.234456e+78。
%E:科學計數法,例如 -1.234456E+78。
%f:有小數部分但無指數部分,例如 123.456。
%F:等價于 %f。
%g:根據實際情況采用 %e 或 %f 格式(以獲得更簡潔的輸出)。
%G:根據實際情況采用 %E 或 %F 格式(以獲得更簡潔的輸出)。
字符串和字節切片
%s:字符串或字節切片的輸出。
%q:帶雙引號的字符串。
%x:每個字節用兩字符十六進制表示(小寫字母),如 “hex” -> “686578”。
%X:每個字節用兩字符十六進制表示(大寫字母)。
布爾類型
%t:true 或 false。
指針
%p:十六進制表示的指針值。
示例代碼
下面是一個示例代碼,演示了各種格式動詞的用法:
package mainimport ("fmt"
)type Person struct {Name stringAge int
}func main() {p := Person{Name: "Alice", Age: 30}fmt.Printf("默認格式: %v\n", p)fmt.Printf("帶字段名: %+v\n", p)fmt.Printf("Go 語法格式: %#v\n", p)fmt.Printf("類型: %T\n", p)i := 42fmt.Printf("二進制: %b\n", i)fmt.Printf("字符: %c\n", i)fmt.Printf("十進制: %d\n", i)fmt.Printf("八進制: %o\n", i)fmt.Printf("十六進制: %x\n", i)fmt.Printf("帶 Unicode: %U\n", i)fmt.Printf("單引號字符: %q\n", i)f := 3.1415926535fmt.Printf("科學計數法 (小寫): %e\n", f)fmt.Printf("科學計數法 (大寫): %E\n", f)fmt.Printf("小數部分: %f\n", f)fmt.Printf("根據情況使用 %%e 或 %%f: %g\n", f)s := "hello"fmt.Printf("字符串: %s\n", s)fmt.Printf("帶引號字符串: %q\n", s)fmt.Printf("十六進制 (小寫): %x\n", s)fmt.Printf("十六進制 (大寫): %X\n", s)b := truefmt.Printf("布爾值: %t\n", b)ptr := &pfmt.Printf("指針: %p\n", ptr)
}
輸出結果
默認格式: {Alice 30}帶字段名: {Name:Alice Age:30}Go 語法格式: main.Person{Name:"Alice", Age:30}類型: main.Person二進制: 101010字符: *十進制: 42八進制: 52十六進制: 2a帶 Unicode: U+002A單引號字符: '*'科學計數法 (小寫): 3.141593e+00科學計數法 (大寫): 3.141593E+00小數部分: 3.141593根據情況使用 %e 或 %f: 3.14159字符串: hello帶引號字符串: "hello"十六進制 (小寫): 68656c6c6f十六進制 (大寫): 68656C6C6F布爾值: true指針: 0xc000010200