标准库之fmt

1、格式化输出的占位符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Printf 格式化输出
fmt.Printf("% + v\n", u)     //格式化输出结构
fmt.Printf("%#v\n", u)       //输出值的 Go 语言表示方法
fmt.Printf("%T\n", u)        //输出值的类型的 Go 语言表示
fmt.Printf("%t\n", true)     //输出值的 true 或 false
fmt.Printf("%b\n", 1024)     //二进制表示
fmt.Printf("%c\n", 11111111) //数值对应的 Unicode 编码字符
fmt.Printf("%d\n", 10)       //十进制表示
fmt.Printf("%o\n", 8)        //八进制表示
fmt.Printf("%q\n", 22)       //转化为十六进制并附上单引号
fmt.Printf("%x\n", 1223)     //十六进制表示,用a-f表示
fmt.Printf("%X\n", 1223)     //十六进制表示,用A-F表示
fmt.Printf("%U\n", 1233)     //Unicode表示
fmt.Printf("%b\n", 12.34)    //无小数部分,两位指数的科学计数法6946802425218990p-49
fmt.Printf("%e\n", 12.345)   //科学计数法,e表示
fmt.Printf("%E\n", 12.34455) //科学计数法,E表示
fmt.Printf("%f\n", 12.3456)  //有小数部分,无指数部分
fmt.Printf("%g\n", 12.3456)  //根据实际情况采用%e或%f输出
fmt.Printf("%G\n", 12.3456)  //根据实际情况采用%E或%f输出
fmt.Printf("%s\n", "wqdew"//直接输出字符串或者[]byte
fmt.Printf("%q\n", "dedede") //双引号括起来的字符串
fmt.Printf("%x\n", "abczxc") //每个字节用两字节十六进制表示,a-f表示
fmt.Printf("%X\n", "asdzxc") //每个字节用两字节十六进制表示,A-F表示
fmt.Printf("%p\n", 0x123)    //0x开头的十六进制数表示

2、Stringer 接口

Stringer接口的定义如下:

1
2
3
type Stringer interface {
        String() string
    }

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type Person struct {
        Name string
        Age  int
        Sex  int
    }
//为Person增加String方法
func (this *Person) String() string {
        buffer := bytes.NewBufferString("This is ")
        buffer.WriteString(this.Name + ", ")
        if this.Sex == 0 {
            buffer.WriteString("He ")
        } else {
            buffer.WriteString("She ")
        }
 
        buffer.WriteString("is ")
        buffer.WriteString(strconv.Itoa(this.Age))
        buffer.WriteString(" years old.")
        return buffer.String()
    }

3、Formatter 接口

Formatter 接口的定义如下:

1
2
3
type Formatter interface {
        Format(f State, c rune)
    }

通过实现 Formatter 接口可以做到自定义输出格式(自定义占位符)。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type Person struct {
    Name string
    Age  int
    Sex  int
}
 
func (this *Person) Format(f fmt.State, c rune) {
    if c == 'L' {
        f.Write([]byte(this.String()))
        f.Write([]byte(" Person has three fields."))
    } else {
        // 没有此句,会导致 fmt.Printf("%s", p) 啥也不输出
        f.Write([]byte(fmt.Sprintln(this.String())))
    }
}
 
func main(){
    p := &Person{"polaris", 28, 0}
    fmt.Printf("%L", p)
}

注意:

1)fmt.State 是一个接口。由于 Format 方法是被 fmt 包调用的,它内部会实例化好一个 fmt.State 接口的实例,我们不需要关心该接口;

2)可以实现自定义占位符,同时 fmt 包中和类型相对应的预定义占位符会无效。因此例子中 Format 的实现加上了 else 子句;

3)实现了 Formatter 接口,相应的 Stringer 接口不起作用。但实现了 Formatter 接口的类型应该实现 Stringer 接口,这样方便在 Format 方法中调用 String() 方法。就像本例的做法;

4)Format 方法的第二个参数是占位符中%后的字母(有精度和宽度会被忽略,只保留字母);

4、GoStringer 接口

GoStringer 接口定义如下:

1
2
3
type GoStringer interface {
    GoString() string
}

该接口定义了类型的Go语法格式。用于打印(Printf)格式化占位符为 %#v 的值。

示例:

1
2
3
4
5
6
7
8
9
type Person struct {
    Name string
    Age  int
    Sex  int
}
 
func (this *Person) GoString() string {
    return "&Person{Name is "+this.Name+", Age is "+strconv.Itoa(this.Age)+", Sex is "+strconv.Itoa(this.Sex)+"}"
}

 

参考:fmt — 格式化 IO · Go语言标准库 (studygolang.com)

 

posted @   ☞@_@  阅读(132)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
点击右上角即可分享
微信分享提示