Go 语言输入输出函数

Posted 极客江南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 语言输入输出函数相关的知识,希望对你有一定的参考价值。

  • Go语言fmt包实现了类似C语言printf和scanf的格式化I/O, 格式化动作源自C语言但更简单
    ##输出函数
  • func Printf(format string, a …interface{}) (n int, err error)
    • 和C语言用法几乎一模一样, 只不过新增了一些格式化符号
    package main
    import "fmt"
    func main() {
        name := "lnj"
        age := 33
        fmt.Printf("name = %s, age = %d\\n", name, age) // name = lnj, age = 33
    }
    
    • 值得注意的是,输出十进制只能通过%d,不能像C语言一样通过%i
    • 除了和C语言一样,可以通过%o、%x输出八进制和十六进制外,还可以直接通过%b输出二进制
    package main
    import "fmt"
    func main() {
        num := 15
        fmt.Printf("十进制 = %d\\n", num)
        fmt.Printf("八进制 = %o\\n", num)
        fmt.Printf("十六进制 = %x\\n", num)
        fmt.Printf("二进制 = %b\\n", num)
    }
    
    • 除此之外,Go语言还增加了%T控制符, 用于输出值的类型
    package main
    import "fmt"
    func main() {
      type Person struct {
      	name string
      	age int
      }
      num1 := 10
      num2 := 3.14
      per := Person{"lnj", 33}
      fmt.Printf("num1 = %T\\n", num1) // int
      fmt.Printf("num2 = %T\\n", num2) // float64
      fmt.Printf("per = %T\\n", per) // main.Person
    }
    
    • 除此之外,Go语言还增加了%v控制符,用于打印所有类型数据
      • Go语言中输出某一个值,很少使用%d%f等, 一般都使用%v即可
      • 输出复合类型时会自动生成对应格式后再输出
    package main
    import "fmt"
    func main() {
      type Person struct {
      	name string
      	age int
      }
      num1 := 10
      num2 := 3.14
      per := Person{"lnj", 33}
      // 此时相当于把%v当做%d
      fmt.Printf("num1 = %v\\n", num1) // 10
      // 此时相当于把%v当做%f
      fmt.Printf("num2 = %v\\n", num2) // 3.14
    }
    
    • Go语言Printf函数其它特性,如宽度、标志、精度、长度、转移符号等,和C语言一样.

  • func Println(a …interface{}) (n int, err error)
    • 采用默认格式将其参数格式化并写入标准输出,
      • 输出之后在结尾处添加换行
      • 传入多个参数时, 会自动在相邻参数之间添加空格
      • 传入符合类型数据时, 会自动生成对应格式后再输出
    package main
    import "fmt"
    func main() {
      num1 := 10
      num2 := 3.14
      fmt.Println(num1, num2) // 10 3.14
      fmt.Println("num1 =", num1, "num2 =", num2) // num1 = 10 num2 = 3.14
    
      type Person struct {
      	name string
      	age int
      }
      per := Person{"lnj", 33}
      fmt.Println(per) // {lnj 33}
    }
    

  • func Print(a …interface{}) (n int, err error)
    • 和Println几乎一样
      • 输出之后不会在结尾处添加换行
      • 传入多个参数时, 只有两个相邻的参数都不是字符串,才会在相邻参数之间添加空格
      • 传入符合类型数据时, 会自动生成对应格式后再输出
    package main
    import "fmt"
    func main() {
      num1 := 10
      num2 := 3.14
      fmt.Print(num1, num2) // 10 3.14
      fmt.Print("num1 =", num1, "num2 =", num2) // num1 =10 num2 =3.14
    
      type Person struct {
      	name string
      	age int
      }
      per := Person{"lnj", 33}
      fmt.Print(per) // {lnj 33}
    }
    

  • 以下三个函数和Printf/Println/Print函数一样, 只不过上面三个函数是输出到标准输出, 而下面三个函数可以通过w指定输出到什么地方
  • func Fprintf(w io.Writer, format string, a …interface{}) (n int, err error)
  • func Fprintln(w io.Writer, a …interface{}) (n int, err error)
  • func Fprint(w io.Writer, a …interface{}) (n int, err error)
package main
import (
	"fmt"
	"net/http"
	"os"
)
func main() {
	// os.Stdout 写入到标准输出
	name := "lnj"
	age := 33
	// 第一个参数: 指定输出到什么地方
	// 第二个参数: 指定格式控制字符串
	// 第三个参数: 指定要输出的数据
	fmt.Fprintf(os.Stdout, "name = %s, age = %d\\n", name, age)

	// http.ResponseWriter 写入到网络响应
	http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
		fmt.Fprintf(writer, "name = %s, age = %d\\n", name, age)
	})
	http.ListenAndServe(":8888", nil)
}

  • 以下三个函数和Printf/Println/Print函数一样, 只不过上面三个函数是输出到标准输出,
    而下面三个函数不会输出,而是将字符串返回给我们
  • func Sprintf(format string, a …interface{}) string
  • func Sprint(a …interface{}) string
  • func Sprintln(a …interface{}) string
package main
import (
	"fmt"
	"net/http"
	"os"
)
func main() {
	name := "lnj"
	age := 33
	// 按照指定的格式生成字符串
	str := fmt.Sprintf("name = %s, age = %d\\n", name, age)
	// 输出生成的字符串
	fmt.Println(str)
}

##输入函数

  • func Scanf(format string, a …interface{}) (n int, err error)
    • 和C语言用法几乎一模一样, 但是只能输入一行数据
    package main
    import "fmt"
    func main() {
        var num1 int
        var num2 int
        fmt.Scanf("%d%d", &num1, &num2)
        fmt.Println(num1, num2)
    }
    
  • func Scan(a …interface{}) (n int, err error)
    • 和C语言scanf函数几乎一样, 只不过不用指定格式化字符串
    package main
    import "fmt"
    func main() {
      var num1 int
      var num2 int
      fmt.Scan(&num1, &num2)
      fmt.Println(num1, num2)
    
      var num3 float32
      var num4 float32
      fmt.Scan(&num3, &num4)
      fmt.Println(num3, num4)
    }
    
  • func Scanln(a …interface{}) (n int, err error)
    • 和C语言用法几乎一模一样, 只不过不用指定格式化字符串, 并且只能输入一行数据
    package main
    import "fmt"
    func main() {
        var num1 int
        var num2 int
        fmt.Scanln(&num1, &num2)
        fmt.Println(num1, num2)
    }
    

  • 以下三个函数和Scan/Scanln/Scanf函数一样, 只不过上面三个函数是从标准输入读取数据, 而下面三个函数可以通过r指定从哪读取数据
  • func Fscanf(r io.Reader, format string, a …interface{}) (n int, err error)
  • func Fscanln(r io.Reader, a …interface{}) (n int, err error)
  • func Fscan(r io.Reader, a …interface{}) (n int, err error)
  package main
  import "fmt"
  func main() {
	  var num1 int
	  var num2 int
	  // 第一个参数: 指定从哪读取数据
	  // 第二个参数: 指定格式控制字符串
	  // 第三个参数: 指定要输出的数据
	  fmt.Fscanf(os.Stdin, "%d%d", &num1, &num2)
	  fmt.Println(num1, num2)


	  s := strings.NewReader("lnj 33")
	  var name string
	  var age int
	  // 从指定字符串中扫描出想要的数据
	  // 注意:
	  fmt.Fscanf(s, "%s%d", &name, &age)
	  fmt.Println("name =",name, "age =",age)
  }
  • 以下三个函数和Scan/Scanln/Scanf函数一样, 只不过上面三个函数是从标准输入读取数据, 而下面三个函数是从字符串中读取数据
  • func Sscan(str string, a …interface{}) (n int, err error)
  • func Sscanf(str string, format string, a …interface{}) (n int, err error)
  • func Sscanln(str string, a …interface{}) (n int, err error)
  package main
  import "fmt"
  func main() {
	str := "lnj 33"
	var name string
	var age int
	//fmt.Sscanf(str, "%s %d",&name, &age)
	//fmt.Sscanln(str,&name, &age)
	fmt.Sscan(str,&name, &age)
	fmt.Println("name =",name, "age =",age)
  }

以上是关于Go 语言输入输出函数的主要内容,如果未能解决你的问题,请参考以下文章

go语言

Go语言 可变参数(变参函数)

密码技术--单向散列函数即Go语言应用

Go语言标准库之fmt

go语言标准库之fmt

Go 输入输出