質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

2回答

4148閲覧

Go言語のinterfaceの存在意義

退会済みユーザー

退会済みユーザー

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

2クリップ

投稿2017/01/04 11:12

###質問内容

go言語のinteraceの存在意義がわかりません。

以下のサイトにgo言語のinterfaceについての説明が書かれていますが、
なぜこのように面倒なことをしなければならないのでしょうか。
https://go-tour-jp.appspot.com/methods/10
http://dev.classmethod.jp/go/golang-6/

おそらく使いこなすと便利なのかもしれないのですが、
自分で実装する際の必要性がいまいちわかりません。

###教えていただたきたいこと
・interfaceを使わなければ実現できないことはあるのでしょうか。
・具体的な便利な利用方法を教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まずこのソースを見て下さい。

go

1package main 2 3import ( 4 "fmt" 5) 6 7type Foo struct{} 8 9func (f *Foo) Name() string { 10 return "Foo" 11} 12 13type Bar struct{} 14 15func (b *Bar) Name() string { 16 return "Bar" 17} 18 19type Named interface{ 20 Name() string 21} 22 23func CallName(named Named) { 24 fmt.Println(named.Name()) 25} 26 27func main() { 28 foo := new(Foo) 29 bar := new(Bar) 30 31 CallName(foo) 32 CallName(bar) 33}

CallName は Foo および Bar どちらの型も受け取れます。継承関係はありませんが、Name() というメソッドがある事だけが型の拘束になります。
この様に、同一の特徴を持った値(この場合 foo もしくは bar)を共通的に取扱いたい場合に interface を用います。

これを Named を使わずやろうと思うとそれぞれの型を引数に持った CallNameFoo もしくは CallNameBar を実装する必要があります。

投稿2017/01/04 11:21

編集2017/01/04 11:27
mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

interface{メソッド}と書くとそのメソッドを実装した変数を格納できるようになりますが、interface{}と書くとなにもメソッドを実装していなくても格納できます。つまり、どんな型のどんな値でも格納できます。
(メソッドを実装する場合については他の回答者さんが既に書かれているので省略します)

https://github.com/golang/go/blob/master/src/fmt/print.go#L630

githubのgolangのfmtパッケージからPrintなどの実装を見ることができます。
どんな型の変数を渡しても適切に表示してくれるのは、このinterface{}型があるからです。
特殊なswitch文を使って型によって処理を分けることができます。

・interfaceを使わなければ実現できないことはあるのでしょうか。

例えば、fmt.PrintBool() fmt.PrintInt64()のようにすべてメソッドを分ければinterfaceがなくてもなんとかなります。
つまり実現できることが増えるかどうかというと微妙ですが、確実にメソッドを実装させることによってプログラミングをしやすくすることや、型を曖昧に扱えることで処理をだいぶ短く書けるなどのメリットがあります。

・具体的な便利な利用方法を教えてください。

https://play.golang.org/p/AcgSY04_io
switch i.(type){}で処理を分けたり、
i.(int)のようにして型アサート(型変換のinterfaceバージョンの呼称)ができたりします。
これを使って、簡単に型別の処理を書くことができます。
自分はjsonの解析でよく使います。
Qiita golangでのjsonのデコード

A Tour of Goでも有用な使い方が説明されていますし、もしやってなければやってみてはいかがでしょう。

投稿2017/01/09 16:12

intelf___

総合スコア868

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

intelf___

2017/01/10 08:01

おーこれは知りませんでした 活用させていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問