スクラッチ・インターフェース(III)からそれを学ぶ行く:一般的な組み込みのインターフェース

ストリンガー:

パッケージで定義されたストリンガーの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を{
   " ループバック:{ 12700
1 }、
   " googleDNS ":{ 8888 }、
 } 
 のための名前、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を呼び出すと同時に、その死のサイクルを完了します。

 

おすすめ

転載: www.cnblogs.com/VingB2by/p/11119856.html