【Go】interface{}とは一体なんなのか
interfaceじゃなくてinterface{}について
どっちもinterfaceだけど僕的には分けて考えたほうが良いと思った
この人の言っていることが大変しっくりくる
(淡白な学習は僕に毒だから、こういう人間の所感が入っている記事だと同意が得られて嬉しい)
結論
- 型っぽい
- Any的なもの
調べる
A Tour of Go曰く
The interface type that specifies zero methods is known as the empty interface:
interface{}
An empty interface may hold values of any type. (Every type implements at least zero methods.)
The interface typeという言葉を見るに型ということみたい
全ての型は少なくとも0個のメソッドを実装しているから
empty interface (→interface{}
) は任意の型の値を保持できる。ということらしい
実際にGoのreflect.TypeOf()メソッドの引数にこのinterface{}は使われている
// TypeOf returns the reflection Type that represents the dynamic type of i. // If i is a nil interface value, TypeOf returns nil. func TypeOf(i interface{}) Type { eface := *(*emptyInterface)(unsafe.Pointer(&i)) return toType(eface.typ) }
俺たちのオブジェクト指向言語CSharp
つまりこれはC#でいうところのObject型みたいなものなのではないか
と考えると分かりやすい (分かりやすいけど「違う!」と怒られそうなのでここで予防線をきちんと張る)
Supports all classes in the .NET class hierarchy and provides low-level services to derived classes. This is the ultimate base class of all .NET classes; it is the root of the type hierarchy.
Object Class (System) | Microsoft Docs
任意の型の値を保持できるという点ではdynamic型っぽくもあるけど、今回はObject型の方がずれがなさそう
ついでにRubyでも丁度Object型が似たようなもの
詳しくないけどJavaもそんな感じみたい
※Goのinterface{}はC#でいうところのObject型みたいなもの。という雑な理解で逃がすのが楽そうだけど
厳密にC#でinterface{}的なことをやろうとしたらこうなる
interface IHoge {} public class Test: IHoge {} // IHogeが空だから何も実装しなくていい
まとめ
全ての型における基底となる型がよくあるオブジェクト指向言語ではObject型として用意されている
Goにおいてはinteface{}がそんな感じの役割を果たしている
(役割であってそのものではない!!)
一般的なinterface、つまり「クラスや構造体に決まった振る舞い(メソッド)を定義するもの」はC#でもGoでも似たような理解で概ね良さそうだけど、
Goのinterface{}だけは用途的に切り離して考えたほうがやさしいと思う
interface{}じゃなくてAnyとかだったら嬉しかったなぁ
(それこそtype Any interface{}
って感じにエイリアスをつくるような感じで)
おまけ
あまりにinterface{}が理解できず、型なのかどうなのかすら怪しかった時にロシアの詩人フョードル・チュッチェフの詩を思い出したのでここに引用しておく
Умом Россию не понять,
Аршином общим не измерить:
У ней особенная стать —
В Россию можно только верить.ロシアは頭ではわからぬ
並みの尺度では測れぬ
ロシアならではの特質がある
ロシアは信じることができるのみ。
ロシアは頭ではわからぬ 並みの尺度では測れぬ ロシアならではの特質がある... - The Embassy of the Russian Federation to Japan | Facebook
interface{}は信じることができるのみ。