Go语言格式化输出
输出格式 | 输出内容 |
---|---|
%v | 值的默认格式表示 |
%+v | 类似 %v,但输出结构体时会添加字段名 |
%#v | 值的 Go 语法表示 |
%Т | 值的类型的 Go 语法表示 |
输出格式 | 输出内容 |
---|---|
%v | 值的默认格式表示 |
%+v | 类似 %v,但输出结构体时会添加字段名 |
%#v | 值的 Go 语法表示 |
%Т | 值的类型的 Go 语法表示 |
package main
import "fmt"
func main() {
str := "steven"
fmt.Printf("%T, %v \n", str, str)
var a rune = '一'
fmt.Printf("%T, %v \n", a, a)
var b byte = 'b'
fmt.Printf("%T, %v \n", b, b)
var c int32 = 98
fmt.Printf("%T, %v \n", c, c)
}
// 结果
string, steven
int32, 19968
uint8, 98
int32, 98
输出格式 | 输出内容 |
---|---|
%t | 单词 true 或 false |
package main
import "fmt"
func main() {
var flag bool
fmt.Printf("%T, %t \n", flag, flag)
flag = true
fmt.Printf("%T, %t \n", flag, flag)
}
// 结果
bool, false
bool, true
输出格式 | 输出内容 |
---|---|
%b | 表示为二进制 |
%c | 该值对应的 unicode 码值 |
%d | 表示为十进制 |
%8d | 表示该整型长度是 8,不足 8 则在数值前补空格;如果超出 8,则以实际为准 |
%08d | 表示该整型长度是 8,不足 8 则在数值前补 0;如果超出 8,则以实际为准 |
%o | 表示为八进制 |
%q | 该值对应的单引号括起来的Go语言语法字符字面值,必要时会采用安全的转义表示 |
%x | 表示为十六进制,使用 a~f |
%X | 表示为十六进制,使用 A~F |
%U | 表示为 unicode 格式:U+1234,等价于 U+%04X |
package main
import "fmt"
func main() {
fmt.Printf("%T, %d \n", 123, 123)
fmt.Printf("%T, %5d \n", 123, 123)
fmt.Printf("%T, %05d \n", 123, 123)
fmt.Printf("%T, %b \n", 123, 123)
fmt.Printf("%T, %o \n", 123, 123)
fmt.Printf("%T, %c \n", 97, 97)
fmt.Printf("%T, %q \n", 97, 97)
fmt.Printf("%T, %x \n", 123, 123)
fmt.Printf("%T, %X \n", 123, 123)
fmt.Printf("%T, %U \n", '一', '一')
}
// 结果
int, 123
int, 123
int, 00123
int, 1111011
int, 173
int, a
int, 'a'
int, 7b
int, 7B
int32, U+4E00
输出格式 | 输出内容 |
---|---|
%b | 无小数部分、二进制指数的科学计数法,如 -123456p-78 |
%e | (=%.6e)有 6 位小数部分的科学计数法,如 -1234.456e+78 |
%E | 科学计数法,如 -1234.456E+78 |
%f | (=%.6f)有 6 位小数部分,如 123.456123 |
%F | 等价于 %f |
%g | 根据实际情况采用 %e 或 %f 格式(获得更简洁、准确的输出) |
%G | 根据实际情况采用 %E 或 %F 格式(获得更简洁、准确的输出) |
package main
import "fmt"
func main() {
fmt.Printf("%b \n", 123.123456)
fmt.Printf("%f \n", 123.1)
fmt.Printf("%.2f \n", 123.125456)
fmt.Printf("%e \n", 123.123456)
fmt.Printf("%E \n", 123.123456)
fmt.Printf("%.1e \n", 123.123456)
fmt.Printf("%F \n", 123.123456)
fmt.Printf("%g \n", 123.123456)
fmt.Printf("%G \n", 123.123456)
}
// 结果
8664042977533870p-46
123.100000
123.13
1.231235e+02
1.231235E+02
1.2e+02
123.123456
123.123456
123.123456
输出格式 | 输出内容 |
---|---|
%s | 直接输出字符串或者字节数组 |
%q | 该值对应的双引号括起来的Go语法字符串字面值,必要时会采用安全的转义表示 |
%x | 每个字节用两字符十六进制数表示,使用 a~f |
%X | 每个字节用两字符十六进制数表示,使用 A~F |
package main
import "fmt"
func main() {
arr := []byte{'x', 'y', 'z', 'z'}
fmt.Printf("%s \n", "欢迎访问")
fmt.Printf("%q \n", "欢迎访问")
fmt.Printf("%x \n", "欢迎访问")
fmt.Printf("%X \n", "欢迎访问")
fmt.Printf("%T, %s \n", arr, arr)
fmt.Printf("%T, %q \n", arr, arr)
fmt.Printf("%T, %x \n", arr, arr)
fmt.Printf("%T, %X \n", arr, arr)
}
//
欢迎访问
"欢迎访问"
e6aca2e8bf8ee8aebfe997aee5beaee5ada6e88b91
E6ACA2E8BF8EE8AEBFE997AEE5BEAEE5ADA6E88B91
[]uint8, xyzz
[]uint8, "xyzz"
[]uint8, 78797a7a
[]uint8, 78797A7A
fmt包实现了类似C语言printf和scanf的格式化I/O。
主要分为向外输出内容和获取输入内容两大部分。
Print系列函数会将内容输出到系统的标准输出,区别在于:
func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)
Fprint系列函数会将内容输出到一个io.Writer接口类型的变量w中,我们通常用这个函数往文件中写入内容。
func Fprint(w io.Writer, a ...interface{}) (n int, err error)
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
只要满足io.Writer接口的类型都支持写入,包括web io。
Sprint系列函数会把传入的数据生成并返回一个字符串。
func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string
Errorf函数根据format参数生成格式化字符串并返回一个包含该字符串的错误。
func Errorf(format string, a ...interface{}) error
e := errors.New("原始错误e")
w := fmt.Errorf("Wrap了一个错误%w", e)
Go语言fmt包下有fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,可以在程序运行过程中从标准输入获取用户的输入。
func Scan(a ...interface{}) (n int, err error)
func main() {
var (
name string
age int
married bool
)
fmt.Scan(&name, &age, &married)
fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)
}
func Scanf(format string, a ...interface{}) (n int, err error)
Scanf从标准输入扫描文本,根据format参数指定的格式去读取由空白符分隔的值保存到传递给本函数的参数中。
返回成功扫描的数据个数和遇到的任何错误。
func main() {
var (
name string
age int
married bool
)
fmt.Scanf("1:%s 2:%d 3:%t", &name, &age, &married)
fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)
}
// 输入:1:General_zy 2:21 3:false
fmt.Scanf不同于fmt.Scan简单的以空格作为输入数据的分隔符,fmt.Scanf为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量。
func Scanln(a ...interface{}) (n int, err error)
Scanln类似Scan,它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。
本函数返回成功扫描的数据个数和遇到的任何错误。
func main() {
var (
name string
age int
married bool
)
fmt.Scanln(&name, &age, &married)
fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)
}
有时候想完整获取输入的内容,而输入的内容可能包含空格,这种情况下可以使用bufio包来实现。示例代码如下:
func bufioDemo() {
reader := bufio.NewReader(os.Stdin) // 从标准输入生成读对象
fmt.Print("请输入内容:")
text, _ := reader.ReadString('\n') // 读到换行
text = strings.TrimSpace(text)
fmt.Printf("%#v\n", text)
}