五、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)
  }
}
相关推荐
俞凡1 天前
Golang 构建网络漏洞扫描器
go
百锦再1 天前
第14章 智能指针
android·java·开发语言·git·rust·go·错误
Mgx1 天前
用 Go 写个“端口扫描器”,100 行代码扫描你家路由器?(别慌,只是看看谁在开门!)
go
mao毛1 天前
go项目适配DTM,gozero已经适配dtm了,goframe项目要怎么适配?
微服务·go
Mgx1 天前
一文讲透 Go 的 defer:你的“善后管家“,别让他变成“背锅侠“!
go
Mgx1 天前
剪贴板监控记:用 Go 写一个 Windows 剪贴板监控器
go
百锦再2 天前
第11章 泛型、trait与生命周期
android·网络·人工智能·python·golang·rust·go
百锦再2 天前
第12章 测试编写
android·java·开发语言·python·rust·go·erlang
Mgx3 天前
你知道程序怎样优雅退出吗?—— Go 开发中的“体面告别“全指南
go
光头闪亮亮4 天前
电子发票解析工具-golang服务端开发案例详解
go