banner
biuaxia

biuaxia

"万物皆有裂痕,那是光进来的地方。"
github
bilibili
tg_channel

Printf 形式化出力

title: Printf フォーマット出力
date: 2022-06-19 21:01:00
toc: false
index_img: http://api.btstu.cn/sjbz/?lx=m_dongman&cid=6
category:

  • Go
    tags:
  • 読み取り
  • 順序
  • サポート
  • フォーマット
  • 出力
  • テキスト
  • 文字列
  • 異なる
  • プリント
  • メソッド
  • ポインタ
  • 関数

Print、Println、Printf、Sprintf、Fprintf はすべて fmt パッケージの公共メソッドであり、情報を印刷する必要があるときにこれらの関数を使用しますが、これらの関数にはどのような違いがあるのでしょうか?

Print: コンソールに出力(フォーマットは受け付けず、各オペランドに %v を適用するのと同じ)
fmt.Print(str)
Println: コンソールに出力し、改行
fmt.Println(tmp)
Printf : フォーマットされた文字列のみを印刷できます。文字列型の変数のみを直接出力できます(整数型の変数や整数などは出力できません)
fmt.Printf("%d",a)
Sprintf:フォーマットして文字列を返しますが、出力はありません。
s := fmt.Sprintf("a %s", "string") fmt.Printf(s)
Fprintf:io.Writersにフォーマットして出力しますが、os.Stdoutには出力しません。
fmt.Fprintf(os.Stderr, “an %s\n”, “error”)

Printf フォーマット出力#

一般的なプレースホルダ:#

v     値のデフォルトフォーマット。  
%+v   フィールド名を追加(構造体のように)  
%#v  Go構文での対応する値の表現  
%T    Go構文での対応する値の型の表現  
%%    リテラルのパーセント記号、値のプレースホルダではない  

ブール値:#

%t   true または false  

整数値:#

%b     2進数表現  
%c     対応するUnicodeコードポイントが表す文字  
%d     10進数表現  
%o     8進数表現  
%q     シングルクォートで囲まれた文字リテラル、Go構文で安全にエスケープ  
%x     16進数表現、アルファベット形式は小文字 a-f  
%X     16進数表現、アルファベット形式は大文字 A-F  
%U     Unicode形式:U+1234、"U+%04X" と同等  

浮動小数点数および複素数:#

%b     小数部分がなく、指数が2の累乗の科学的表記法、strconv.FormatFloatの 'b' 変換形式と一致。例 -123456p-78  
%e     科学的表記法、例 -1234.456e+78  
%E     科学的表記法、例 -1234.456E+78  
%f     小数点があり、指数がない、例 123.456  
%g     状況に応じて %e または %f を選択して、よりコンパクトな(末尾の0がない)出力を生成  
%G     状況に応じて %E または %f を選択して、よりコンパクトな(末尾の0がない)出力を生成  

文字列とバイトのスライス表現:#

%s     文字列またはスライスの未解釈バイト  
%q     ダブルクォートで囲まれた文字列、Go構文で安全にエスケープ  
%x     16進数、小文字、各バイト2文字  
%X     16進数、大文字、各バイト2文字  

ポインタ:#

%p     16進数表現、プレフィックス 0x  

ここには 'u' プレースホルダはありません。整数が符号なし型の場合、それらは符号なしで印刷されます。同様に、ここでオペランドのサイズ(int8、int64)を指定する必要はありません。

% v のデフォルトフォーマットは:#

bool:                    %t  
int, int8 など:          %d  
uint, uint8 など:        %d, %x が %#v で印刷された場合  
float32, complex64 など: %g  
string:                  %s  
chan:                    %p  
pointer:                 %p  

このように、デフォルトの出力フォーマットは % v で指定できます。デフォルトと異なる他のフォーマットを出力しない限り、% v を使用して代替できます。

複合オブジェクトの場合:#

内部の要素は次のルールに従って印刷されます:

struct:            {field0 field1 ...}  
array, slice:      [elem0 elem1 ...]  
maps:              map[key1:value1 key2:value2]  
pointer to above:  &{}, &[], &map[]  

幅と精度:#

幅は % の後の値で、指定されていない場合はその値のデフォルト値が使用されます。精度は幅の後の値で、指定されていない場合も印刷する値のデフォルト精度が使用されます。例えば:%9.2f、幅 9、精度 2

%f:      デフォルト幅、デフォルト精度  
%9f      幅 9、デフォルト精度  
%.2f     デフォルト幅、精度 2  
%9.2f    幅 9、精度 2  
%9.f     幅 9、精度 0  

数値に関して、幅はその数値が占める領域の最小幅です。精度は小数点以下の桁数です。しかし、% g/% G に関しては、精度はすべての数字の合計数です。例えば、123.45 に対して、フォーマット %6.2f は 123.45 を印刷し、%.4g は 123.5 を印刷します。% e と % f のデフォルト精度は 6 ですが、% g のデフォルト精度はその値に必要な最小桁数です。

ほとんどの値に関して、幅は出力の最小文字数であり、必要に応じてフォーマットされた形式に空白が埋められます。文字列に関しては、精度は出力の最大文字数であり、必要に応じて直接切り捨てられます。

幅は「必要な最小幅」を指します。結果の文字列の幅が指定された幅を超える場合、指定された幅は無効になります。

幅を * と指定すると、パラメータから幅の値を取得します。

"." の後に続く数列は精度を示します("." のみの場合は ".0" になります)。整数の指示子(d', i', b', o', x', X', `u')に出会った場合、精度は数値部分の長さを示します。

浮動小数点数の指示子(`f')に出会った場合、それは小数部分の桁数を示します。

浮動小数点数の指示子(e', E', g', G')に出会った場合、それは有効桁数を示します。

精度を * と設定すると、パラメータから精度の値を取得します。

文字列 % s または浮動小数点型 % f に関しては、精度がデータの長さを切り捨てることができます。次のように。

func main() {
    a := 123
    fmt.Printf("%1.2d\n", a)    //123、幅1は数値自体の幅より小さいため無効、精度は2で整数を切り捨てられない
    b := 1.23
    fmt.Printf("%1.1f\n", b)    //1.2、精度1で浮動小数点型データを切り捨て
    c := "asdf"
    fmt.Printf("%*.*s\n", 1, 2, c) //as、'*' を利用して幅と精度の入力をサポートし、文字列も精度で切り捨てられる
}
+     数値の正負を表示;%q(%+q)ではASCIIエンコードされた文字のみを出力することを保証。  
-     左揃え  
#     代替フォーマット:8進数に先頭の0を追加(%#o)、16進数に先頭の0x(%#x)または0X(%#X)を追加、%p(%#p)では先頭の0xを削除;%qに対して、strconv.CanBackquote が true を返す場合、元の(すなわちバッククォートで囲まれた)文字列が印刷される;可視文字の場合、%U(%#U)はその文字のUnicodeエンコード形式を出力します(例えば文字 x は U+0078 'x' として印刷される)。  
' '  (空白)は数値中の省略された正負の符号のために空白を残す(% d);16進数(% x, % X)で文字列またはスライスを印刷する際、バイト間に空白を挿入  
0     空白の代わりに先頭の0で埋める;数値の場合、これは正負の符号の後に埋める  

各 Printf 系の関数には Print 関数があり、この関数はフォーマットを受け付けず、各オペランドに % v を適用するのと同じです。別の可変引数関数 Println はオペランドの間に空白を挿入し、末尾に改行を追加します。

プレースホルダを考慮しない場合、オペランドがインターフェース値であれば、その内部の具体的な値が使用され、インターフェース自体ではありません。次のように:

package main
 
import (
	"fmt"
)
 
type Sample struct{
	a   int
	str string
}
 
func main() {
	var i interface{} = Sample{1, "a"}
	fmt.Printf("%v\n", i)      //{1 a}
}

明示的なパラメータプレースホルダ:#

Go では、出力フォーマットでその出力の順序を指定することにより、明示的なパラメータプレースホルダをサポートしています。次のように:

func main(){
    fmt.Printf("%[2]d, %[1]d\n", 11, 22)  //22, 11、最初に2番目の値を出力し、その後に1番目の値を出力
}

いくつかの入力方法の違い#

Scan、Scanf および Scanln        os.Stdin から読み取る;  
Fscan、Fscanf および Fscanln     指定された io.Reader から読み取る;  
Sscan、Sscanf および Sscanln     実引数文字列から読み取る。  
Scanln、Fscanln および Sscanln   改行文字でスキャンを停止し、エントリは改行文字の直後に続く必要がある;  
Scanf、Fscanf および Sscanf      フォーマット内の改行文字に一致するために改行文字が必要;他の関数は改行文字を空白として扱う。  

package main  
import "fmt"  
import "os"  
type point struct {  
    x, y int  
}  
func main() {  
    //Goは一般的なGo値のフォーマット設計に多くの印刷方法を提供しています。例えば、ここではpoint構造体のインスタンスを印刷しています。  
    p := point{1, 2}  
    fmt.Printf("%v\n", p) // {1 2}  
    //値が構造体である場合、%+v のフォーマット出力内容には構造体のフィールド名が含まれます。  
    fmt.Printf("%+v\n", p) // {x:1 y:2}  
    //%#v 形式はこの値のGo構文表現を出力します。例えば、値の実行ソースコードスニペット。  
    fmt.Printf("%#v\n", p) // main.point{x:1, y:2}  
    //値の型を印刷するには、%T を使用します。  
    fmt.Printf("%T\n", p) // main.point  
    //ブール値のフォーマットは簡単です。  
    fmt.Printf("%t\n", true)  
    //整数のフォーマットには多くの方法があり、%dを使用して標準の10進数フォーマットを行います。  
    fmt.Printf("%d\n", 123)  
    //この出力は2進数表現形式です。  
    fmt.Printf("%b\n", 14)  
    //この出力は指定された整数の対応する文字です。  
    fmt.Printf("%c\n", 33)  
    //%x は16進数エンコーディングを提供します。  
    fmt.Printf("%x\n", 456)  
    //浮動小数点型にも多くのフォーマットオプションがあります。%fを使用して最も基本的な10進数フォーマットを行います。  
    fmt.Printf("%f\n", 78.9)  
    //%e と %E は浮動小数点型を(わずかに異なる)科学的記数法表現形式にフォーマットします。  
    fmt.Printf("%e\n", 123400000.0)  
    fmt.Printf("%E\n", 123400000.0)  
    //%s を使用して基本的な文字列出力を行います。  
    fmt.Printf("%s\n", "\"string\"")  
    //Goソースコードのようにダブルクォート付きの出力を行うには、%q を使用します。  
    fmt.Printf("%q\n", "\"string\"")  
    //上記の整数と同様に、%x はbase-16エンコーディングされた文字列を出力し、各バイトは2文字で表されます。  
    fmt.Printf("%x\n", "hex this")  
    //ポインタの値を出力するには、%p を使用します。  
    fmt.Printf("%p\n", &p)  
    //数値を出力する際には、出力結果の幅と精度を制御したいと思うことがよくあります。% の後に数字を使用して出力幅を制御できます。デフォルトの結果は右揃えで、空白で埋められます。  
    fmt.Printf("|%6d|%6d|\n", 12, 345)  
    //浮動小数点型の出力幅を指定することもでき、幅.精度の構文を使用して出力の精度を指定できます。  
    fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45)  
    //最も左揃えにするには、- フラグを使用します。  
    fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45)  
    //文字列出力の幅を制御したい場合もあります。特に、表形式の出力時に整列を確保するためです。これは基本的な右揃え幅表示です。  
    fmt.Printf("|%6s|%6s|\n", "foo", "b")  
    //左揃えにするには、数字と同様に - フラグを使用します。  
    fmt.Printf("|%-6s|%-6s|\n", "foo", "b")  
    //これまでに、Printfを見てきました。これはos.Stdoutにフォーマットされた文字列を出力します。Sprintfはフォーマットして文字列を返しますが、出力はありません。  
    s := fmt.Sprintf("a %s", "string")  
    fmt.Println(s)  
    //Fprintfを使用して、io.Writersにフォーマットして出力することもできますが、os.Stdoutには出力しません。  
    fmt.Fprintf(os.Stderr, "an %s\n", "error")  
}

Scanf フォーマット出力#

Scanf、Fscanf および Sscanf は、フォーマット文字列に基づいて実引数を解析します。これは Printf に似ています。例えば、% x は整数を 16 進数としてスキャンし、% v はその値のデフォルト表現形式をスキャンします。

フォーマットは Printf に似ていますが、例外もあります。次のように:

%p  実装されていない  
%T  実装されていない  
%e %E %f %F %g %G  はすべて完全に同等で、任意の浮動小数点数または複合数値をスキャンできます  
%s と %v     文字列をスキャンする際、空白を区切り文字として扱います  
フラグ # と +  は実装されていません  

入力 Scanf において、幅は入力されるテキストとして理解できます(%5s は 5 文字を入力することを示します)。Scanf には精度という概念はありません(%5.2f はなく、%5f のみです)。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。