ストリンガー:
パッケージで定義されたストリンガーのFMTは、最も一般的なインターフェースの一つです。
型ストリンガーのインターフェース{ 文字列()文字列 }
Stringer
その種類によって記述できる文字列です。fmt
このインタフェースを介してパッケージ(多くのパケット)が値を印刷します。
Person型の構造体{ 名文字列 年齢INT } FUNC(Pパーソン)文字列()文字列{ 戻り fmt.Sprintf(" 体積%(体積%年)" 、p.Name、p.Age) } FUNCメインを(){ A: = {人" アーサー・デント"、42 } Z: =人{ " Zaphod Beeblebrox "、9001 } fmt.Println(Z) }
結果:
アーサー・デント(42歳)
Zaphod Beeblebrox(9001年)
演習:https://tour.go-zh.org/methods/18
させることで IPAddr
タイプを実装し fmt.Stringer
、それらを分離するアドレスポイントを印刷します。
例えば、IPAddr{1, 2, 3, 4}
それは次のように印刷されるべきです "1.2.3.4"
。
IPAddrを[タイプ4 ] バイト// 给IPAddrを添加一个"文字列()文字列"方法:TODO FUNC(I IPAddrを)文字列(IPADDR [ 4 ] バイト)の文字列{ 戻り fmt.Sprintf(" %のV%vを%。 。V%のV "IPADDR [ 0 ]、IPADDR [ 1 ]、IPADDR [ 2 ]、IPADDR [ 3 ]) } メインFUNC(){ ホスト: =マップ[ ストリング] IPAddrを{ " ループバック」:{ 127、0、0、 1 }、 " googleDNS ":{ 8、8、8、8 }、 } のための名前、IP:= レンジホスト{ fmt.Printf(" 体積%:%Vを\ n " 、名前、ip.String(IP)) } }
結果:
ループバック:127.0.0.1
googleDNS:8.8.8.8
エラー:
囲碁プログラムが使用する error
エラー状態を示す値を。
そして、 fmt.Stringer
同様のerror
タイプは、組み込みインターフェイスです。
型エラーインターフェース{ エラー()文字列 }
(そして、 fmt.Stringer
同様に、fmt
パケットが満足されるときに、印刷の値 error
)。
典型的には、関数が返す error
値を、呼び出し元のコードは、エラーに等しくなければならないか否かが判断される nil
エラーハンドリングします。
I、ERR = strconv.Atoi(" 42 " ) 場合誤る=!ゼロ{ fmt.Printf(" 数値を変換できませんでした:%Vを\ n " 、ERR) リターン } fmt.Println(" 変換された整数:"、私)
error
ときnilは成功を示している。nil以外の error
故障。
演習:https://tour.go-zh.org/methods/20
より前の演習の複製 Sqrt
機能、返すように修正し error
た値を。
Sqrt
負の数を受信すると、それが非nilのエラー値を返す必要があります。複合体はまた、サポートされていません。
新しいタイプを作成します。
タイプErrNegativeSqrtのfloat64
そして、その実現
FUNC(E ErrNegativeSqrt)エラー()文字列
この方法は、それが持っている error
ことで、値を ErrNegativeSqrt(-2).Error()
メソッド返す必要があります呼び出します "cannot Sqrt negative number: -2"
。
変更 Sqrt
負の戻り受け入れるために、機能を ErrNegativeSqrt
値。
ErrNegativeSqrtのfloat64型 FUNC SQRT(Xのfloat64)(のfloat64、エラー){ もし、X> = 0 { 戻りX、ゼロ } 戻り 0 、ErrNegativeSqrt(X) } FUNC(E ErrNegativeSqrt)エラー()文字列{ 戻り fmt.Sprintf (" 負の数SQRTできません:%のV "、のfloat64(e)の)// 这里要加入のfloat64() } FUNCのmain(){ fmt.Println(SQRT(2 )) fmt.Println(SQRT( - 2 )) }
結果:
2 <ゼロ>
0は負の値をSQRTできません-2
注意:で Error
呼び出すメソッド fmt.Sprint(e)
無限ループにプログラムを作ります。あなたは、変換することができ e
、この問題を回避するために:fmt.Sprint(float64(e))
。
FUNC(E ErrNegativeSqrt)エラー()文字列{ 返す fmt.Sprintfを(" 負の数SQRTすることはできません:%のV "、E)// 問題のコードを }
この問題の理由はfmt.Sprintfは、電子がインタフェース型である知っているのでそうe.Error()は、文字列とリターンを構成するために呼び出して、インターフェイスのクエリを介して行われますが、e.Error()は順番にfmt.Sprintfを呼び出すと同時に、その死のサイクルを完了します。