golangでインターフェースオブジェクトを変換する2つの方法
2022-02-14 19:49:06
インターフェース・オブジェクトを変換するには、2つの方法があります。
1. 方法1: インスタンス,OK:=インターフェース・オブジェクト。(実際の型)
インターフェースオブジェクトが対応する実際の型であれば、instanceは変換されたオブジェクトであり、okの値は真である
if... ...else if...と併用してください。使用方法
2.方法2
インターフェースオブジェクトです。(タイプ)
switch... .case文と一緒に使用します。
例
package main
import (
"fmt"
"math"
)
type shape interface {
perimeter() int
area() int
}
type rectangle struct {
a int // length
b int // width
}
func (r rectangle) perimeter() int {
return (r.a + r.b) * 2
}
func (r rectangle) area() int {
return r.a * r.b
}
type circle struct {
radios int
}
func (circle) perimeter() int {
return 2 * c.radios * int(math.Round(math.Pi))
}
func (circle) area() int {
return int(math.Round(math.Pow(float64(c.radios), 2) * math.Pi))
}
func getType(s shape) {
if i, ok := s.(rectangle); ok {
fmt.Printf("The length of the rectangle: %d,the width of the rectangle is: %d\n", i.a, i.b)
} else if i, ok := s.(circle); ok {
fmt.Printf("The radius of the circle is: %d\n", i.radios)
}
}
func getType2(s shape) {
switch i := s.(type) {
case rectangle:
fmt.Printf("Length of rectangle: %d,Width of rectangle is: %d\n", i.a, i.b)
case circle:
fmt.Printf("The radius of the circle is: %d\n", i.radios)
}
}
func getResult(shape) {
fmt.Printf("The perimeter of the shape is: %d,the area of the shape is: %d\n", s.perimeter(), s.area())
}
func main() {
r := rectangle{a: 10, b: 20}
getType(r)
getResult(r)
c := circle{radios: 5}
getType2(c)
getResult(c)
}
上記の例では方法1を使っていますが、方法2を使うには、getType()関数を次のように変更します。
func getType(s shape) {
switch i := s.(type) {
case rectangle:
fmt.Printf("length of shape: %.2f, width of shape: %.2f \n", i.a, i.b)
case triangle:
fmt.Printf("first edge of the graph: %.2f, second edge of the graph: %.2f, third edge of the graph: %.2f \n", i.a, i.b, i.c)
case circular:
fmt.Printf("radius of the graph: %.2f \n",i.radius)
}
}
追記:上記の三角形の面積は、ヘレンの公式を使って、次のように求められます。
三角形の面積=平方根[三角形の外周の半分×(三角形の外周の半分から1辺を引いたもの)×(三角形の外周の半分から2辺を引いたもの)×(三角形の外周の半分から3辺を引いたもの)]とする。
golangのインターフェースオブジェクトの変換に関するこの記事がすべてです。golangのインターフェースオブジェクトに関するより詳しい情報は、スクリプトハウスの過去の記事を検索するか、以下の関連記事を引き続きご覧ください!今後ともスクリプトハウスをよろしくお願いします。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン