五、Go语法基础(输入和输出)

Golang中文学习文档地址

1、文件描述符

go 复制代码
var (
    Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
    Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
    Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)
  • Go中的os包有三个对外暴露的三个文件描述符

    • os.Stdin - 标准输入,文件描述符为:0。
    • os.Stdout - 标准输出,文件描述符为:1。
    • os.Stderr - 标准错误,文件描述符为:2。

2、输出

  • stdout:使用底层os.Stdout.WriteString函数。

    go 复制代码
    package main
    
    import "os"
    
    func main() {
        os.Stdout.WriteString("Hello World")
    }
  • print和println:使用Go内置的print和println,输出到标准错误中。

    go 复制代码
    package main
    
    func main() {
      print("hello world!\n")//不带换行
      println("hello world")//自带换行
    }
  • fmt:fmt包下的输出,输出到标准输出中。

    go 复制代码
    package main
    
    import "fmt"
    
    func main() {
            fmt.Println("hello world")
    }
  • bufio:带缓冲的输出。

    bufio提供了可缓冲的输出方法,它会先将数据写入到内存中,积累到了一定阈值再输出到指定的Writer中,默认缓冲区大小是4KB。在文件 IO,网络 IO 的时候建议使用这个包。

    go 复制代码
    func main() {
      writer := bufio.NewWriter(os.Stdout)
      defer writer.Flush()
      writer.WriteString("hello world!")
    }
  • 输出格式化

    Go中的格式化输出功能基本上由fmt.Printf函数提供。

    go 复制代码
    func main() {
      fmt.Printf("hello world, %s!", "jack")
    }
序号 格式化 描述 接收类型
1 %% 输出百分号% 任意
2 %s 输出string/[] byte string,[] byte
3 %q 格式化字符串,输出的字符串两端有双引号"" string,[] byte
4 %d 输出十进制整型值 整型
5 %f 输出浮点数 浮点
6 %e 输出科学计数法形式 ,也可以用于复数 浮点
7 %E %e相同 浮点
8 %g 根据实际情况判断输出%f或者%e,会去掉多余的 0 浮点
9 %b 输出整型的二进制表现形式 数字
10 %#b 输出二进制完整的表现形式 数字
11 %o 输出整型的八进制表示 整型
12 %#o 输出整型的完整八进制表示 整型
13 %x 输出整型的小写十六进制表示 数字
14 %#x 输出整型的完整小写十六进制表示 数字
15 %X 输出整型的大写十六进制表示 数字
16 %#X 输出整型的完整大写十六进制表示 数字
17 %v 输出值原本的形式,多用于数据结构的输出 任意
18 %+v 输出结构体时将加上字段名 任意
19 %#v 输出完整 Go 语法格式的值 任意
20 %t 输出布尔值 布尔
21 %T 输出值对应的 Go 语言类型值 任意
22 %c 输出 Unicode 码对应的字符 int32
23 %U 输出字符对应的 Unicode 码 rune,byte
24 %p 输出指针所指向的地址 指针

3、 输入

  • read:使用底层os.Stdin.Read函数。
go 复制代码
func main() {
  var buf [1024]byte
  n, _ := os.Stdin.Read(buf[:])
  os.Stdout.Write(buf[:n])
}
  • fmt:fmt包下的输入。
go 复制代码
// 扫描从os.Stdin读入的文本,根据空格分隔,换行也被当作空格
func Scan(a ...any) (n int, err error)

// 与Scan类似,但是遇到换行停止扫描
func Scanln(a ...any) (n int, err error)

// 根据格式化的字符串扫描
func Scanf(format string, a ...any) (n int, err error)
  • bufio:在有大量输入需要读取的时候,就建议使用bufio.Reader来进行内容读取。
go 复制代码
func main() {
    reader := bufio.NewReader(os.Stdin)
    var a, b int
    fmt.Fscanln(reader, &a, &b)
    fmt.Printf("%d + %d = %d\n", a, b, a+b)
}
  • scanner:bufio.Scannerbufio.Reader类似,不过它是按行读取的。
go 复制代码
func main() {
  scanner := bufio.NewScanner(os.Stdin)
  for scanner.Scan() {
    line := scanner.Text()
    if line == "exit" {
      break
    }
    fmt.Println("scan", line)
  }
}
相关推荐
梦想很大很大17 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰1 天前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘1 天前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤1 天前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt112 天前
AI DDD重构实践
go
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto5 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室6 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题6 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉8 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想