標準ライブラリFMTのGo言語の学習過程の中で最も頻度の高いの一つと私たちの最初の接触で、この記事では、いくつかの一般的な機能fmtbパッケージについて説明します。
FMT
I / Oのフォーマットされた同様のパッケージのFMT C言語のprintfおよびscanfを達成するために 出力外部入力内容に分けて、二つの部分の内容にアクセスします。
出力外側に
標準ライブラリには、fmt
次のような出力関連の機能を提供します。
プリント
Print
システムの標準出力にSUMMARY系列関数が出力されますが、それ以外Print
に直接コンテンツを出力する機能、Printf
機能はフォーマットされた出力文字列をサポートし、Println
機能は、コンテンツ内の改行の出力端を追加します。
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)
ここでは簡単な例です:
func main() {
fmt.Print("在终端打印该信息。")
name := "沙河小王子"
fmt.Printf("我是:%s\n", name)
fmt.Println("在终端打印单独一行显示")
}
上記の実行コードの出力:
在终端打印该信息。我是:沙河小王子
在终端打印单独一行显示
FPRINT
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)
例えば:
// 向标准输出写入内容
fmt.Fprintln(os.Stdout, "向标准输出写入内容")
fileObj, err := os.OpenFile("./xx.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
fmt.Println("打开文件出错,err:", err)
return
}
name := "沙河小王子"
// 向打开的文件句柄中写入内容
fmt.Fprintf(fileObj, "往文件中写如信息:%s", name)
限り、なおio.Writer
インタフェースの種類が書き込みをサポートします。
スプリント
Sprint
シリーズの機能は、入力データを生成し、文字列を返します。
func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string
次のように単純な例のコードは次のとおりです。
s1 := fmt.Sprint("沙河小王子")
name := "沙河小王子"
age := 18
s2 := fmt.Sprintf("name:%s,age:%d", name, age)
s3 := fmt.Sprintln("沙河小王子")
fmt.Println(s1, s2, s3)
Errorf
Errorf
書式文字列書式関数は生成して、エラーを含む文字列を返します。
func Errorf(format string, a ...interface{}) error
、通常例えば、エラーの種類をカスタマイズするために使用:
err := fmt.Errorf("这是一个错误")
フォーマットプレースホルダ
*printf
変数は、我々は、プレースホルダに従うフォーマットパラメータにフォーマットをサポートしている機能のファミリー分類、簡単にアクセスし、メモリを交換することになります。
ユニバーサルプレースホルダ
プレースホルダ | 説明 |
---|---|
体積% | 値のデフォルトの形式表現 |
%+ V | 同様%vは、しかし、フィールド名の出力構造が追加されます |
%#V | 値の構文表現を行きます |
%T | 印刷の型の値 |
%% | パーセント記号 |
次のようにサンプル・コードは次のとおりです。
fmt.Printf("%v\n", 100)
fmt.Printf("%v\n", false)
o := struct{ name string }{"小王子"}
fmt.Printf("%v\n", o)
fmt.Printf("%#v\n", o)
fmt.Printf("%T\n", o)
fmt.Printf("100%%\n")
出力:
100
false
{小王子}
struct { name string }{name:"小王子"}
struct { name string }
100%
ブーリアン
プレースホルダ | 説明 |
---|---|
%トン | trueまたはfalse |
整数
プレースホルダ | 説明 |
---|---|
%bの | バイナリとして表さ |
%のC | コード値に対応するユニコード値 |
%D | 小数点以下のように表現 |
% | オクタルとして表現 |
%バツ | 進数で表すと、AFを使います |
%バツ | AFを使用して16進数で表現さ |
%U | "U +%04X" に相当U + 1234:Unicode形式は以下のように表現されます |
%qを | この値は、文字リテラル構文を行く安全な脱出を必ずしも表す場合、使用される単一引用符に対応します |
次のようにサンプル・コードは次のとおりです。
n := 65
fmt.Printf("%b\n", n)
fmt.Printf("%c\n", n)
fmt.Printf("%d\n", n)
fmt.Printf("%o\n", n)
fmt.Printf("%x\n", n)
fmt.Printf("%X\n", n)
出力:
1000001
A
65
101
41
41
浮動小数点と複雑
プレースホルダ | 説明 |
---|---|
%bの | 小数部分も、そのような-123456p-78などのバイナリ指数科学的表記、いいえ |
%eは | 科学的表記法、例えば-1234.456e + 78として |
%E | 科学的表記法、例えば-1234.456E + 78として |
%F | 指数部のない端数部分、123.456 |
%F | %Fは、と等価です |
%グラム | (より簡潔、正確な出力のために)実際の%のE F%の使用、または |
%G | 実際の使用条件または(より簡潔、正確な出力のために)%のF%のEフォーマット |
次のようにサンプル・コードは次のとおりです。
f := 12.34
fmt.Printf("%b\n", f)
fmt.Printf("%e\n", f)
fmt.Printf("%E\n", f)
fmt.Printf("%f\n", f)
fmt.Printf("%g\n", f)
fmt.Printf("%G\n", f)
出力:
6946802425218990p-49
1.234000e+01
1.234000E+01
12.340000
12.34
12.34
そして、String []型のバイト
プレースホルダ | 説明 |
---|---|
%sの | または直接出力文字列[]バイト |
%qを | この値は、二重引用符に対応した構文文字列リテラルを行く安全な脱出を必ずしも表す場合、使用されます |
%バツ | 各バイトは、2文字の16進数で(AF使用することを表しています |
%バツ | 各バイトは、2文字の16進数で(AFを使用して)で表されます |
次のようにサンプル・コードは次のとおりです。
s := "小王子"
fmt.Printf("%s\n", s)
fmt.Printf("%q\n", s)
fmt.Printf("%x\n", s)
fmt.Printf("%X\n", s)
出力:
小王子
"小王子"
e5b08fe78e8be5ad90
E5B08FE78E8BE5AD90
ポインタ
プレースホルダ | 説明 |
---|---|
%P | 彼は、16進数として表現され、先頭の0xで |
次のようにサンプル・コードは次のとおりです。
a := 10
fmt.Printf("%p\n", &a)
fmt.Printf("%#p\n", &a)
出力:
0xc000094000
c000094000
幅の識別子
幅が指定されていない場合は、直ちに指定された進数の後ろにパーセント記号によって幅は、それが必要な値に加えて、充填されないことを示しています。小数点数が続く(オプション)によって精度が指定された幅が続きます。精度が指定されていない場合は、デフォルトの精度を使用します。精度を表す数が0であるとの点ではない場合。たとえば、次のように:
プレースホルダ | 説明 |
---|---|
%F | デフォルトの幅は、デフォルトの精度 |
%9F | 幅9、デフォルトの精度 |
%.2f | デフォルトの幅は、精度2 |
%9.2f | 9幅、精度2 |
%9.f | 9幅、精度0 |
次のようにサンプル・コードは次のとおりです。
n := 12.34
fmt.Printf("%f\n", n)
fmt.Printf("%9f\n", n)
fmt.Printf("%.2f\n", n)
fmt.Printf("%9.2f\n", n)
fmt.Printf("%9.f\n", n)
出力:
12.340000
12.340000
12.34
12.34
12
その他falg
プレースホルダ | 説明 |
---|---|
'+' | 常に値の符号を出力し、すべてのASCII文字を生成する%のQ(%+ Q)からは(エスケープによって)出力されます。 |
「」 | 数値だけで負の前にマイナス記号の前にスペースの数は、%X%X(%xまたは%のX)を使用してバイトまたは文字列の間の空間は、それぞれ印刷されます |
' - ' | 右の出力のギャップを埋める代わりにデフォルトの左側(即ち、左詰めデフォルトに切り替える右から整列)。 |
'#' | プラス0(%#0)進数、16進数フロントプラス0X(%#1 X)または0X(%#1 X)の前に、%のQ(%位のQ)の前方ポインタ0X(%位のP)を除去%のU(%#U)とスペースは、単一引用符がリテラル行く出力します。 |
'0' | 代わりの0値型のため、0で満たされた空間は、看板の裏に記入します。 |
例えば:
s := "小王子"
fmt.Printf("%s\n", s)
fmt.Printf("%5s\n", s)
fmt.Printf("%-5s\n", s)
fmt.Printf("%5.7s\n", s)
fmt.Printf("%-5.7s\n", s)
fmt.Printf("%5.2s\n", s)
fmt.Printf("%05s\n", s)
出力:
小王子
小王子
小王子
小王子
小王子
小王
00小王子
入力を取得
外出言語は、fmt
アンダークラッドfmt.Scan
、fmt.Scanf
、fmt.Scanln
三つの機能は、ユーザ入力が実行されている標準的な入力プログラムから得ることができます。
fmt.Scan
次のように与えられた署名機能:
func Scan(a ...interface{}) (n int, err error)
- Scan从标准输入扫描文本,读取由空白符分隔的值保存到传递给本函数的参数中,换行符视为空白符。
- 本函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因。
具体代码示例如下:
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)
}
将上面的代码编译后在终端执行,在终端依次输入小王子
、28
和false
使用空格分隔。
$ ./scan_demo
小王子 28 false
扫描结果 name:小王子 age:28 married:false
fmt.Scan
从标准输入中扫描用户输入的数据,将以空白符分隔的数据分别存入指定的参数。
fmt.Scanf
函数签名如下:
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)
}
将上面的代码编译后在终端执行,在终端按照指定的格式依次输入小王子
、28
和false
。
$ ./scan_demo
1:小王子 2:28 3:false
扫描结果 name:小王子 age:28 married:false
fmt.Scanf
不同于fmt.Scan
简单的以空格作为输入数据的分隔符,fmt.Scanf
为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量。
例如,我们还是按照上个示例中以空格分隔的方式输入,fmt.Scanf
就不能正确扫描到输入的数据。
$ ./scan_demo
小王子 28 false
扫描结果 name: age:0 married:false
fmt.Scanln
函数签名如下:
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)
}
将上面的代码编译后在终端执行,在终端依次输入小王子
、28
和false
使用空格分隔。
$ ./scan_demo
小王子 28 false
扫描结果 name:小王子 age:28 married:false
fmt.Scanln
遇到回车就结束扫描了,这个比较常用。
bufio.NewReader
有时候我们想完整获取输入的内容,而输入的内容可能包含空格,这种情况下可以使用bufio
包来实现。示例代码如下:
func bufioDemo() {
reader := bufio.NewReader(os.Stdin) // 从标准输入生成读对象
fmt.Print("请输入内容:")
text, _ := reader.ReadString('\n') // 读到换行
text = strings.TrimSpace(text)
fmt.Printf("%#v\n", text)
}
Fscan系列
这几个函数功能分别类似于fmt.Scan
、fmt.Scanf
、fmt.Scanln
三个函数,只不过它们不是从标准输入中读取数据而是从io.Reader
中读取数据。
func Fscan(r io.Reader, a ...interface{}) (n int, err error)
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
Sscan系列
这几个函数功能分别类似于fmt.Scan
、fmt.Scanf
、fmt.Scanln
三个函数,只不过它们不是从标准输入中读取数据而是从指定字符串中读取数据。
func Sscan(str string, a ...interface{}) (n int, err error)
func Sscanln(str string, a ...interface{}) (n int, err error)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)