カラクリスタ

「輝かしい青春」なんて失かった人のブログ

Golang の struct 型とか interface 型は、Perl で言うところの Role 脳でなんとかなる

概要: と、僕は勝手に思ってます。


いや、なんの話かって言うと、@lestrrat さんのスライド、

http://go-talks.appspot.com/github.com/lestrrat/go-slides/2014-yapcasia-go-for-perl-mongers/main.slide#1Go For Perl Mongers

を読んでいた時に、

あれ、これ(golang の)struct 型とか interface 型とかの罠ってどう乗り越えたっけな?

と思い出していたときに、

Golang の struct 型と interface 型の関係は、 Perl で言う所のRole::Tiny::WithRole::Tinyみたいな感じなのかな?

と理解していたのを思い出したので、今日はその辺り書きます。

1. なんと言ったら分からないので、以下実際のコード

1.1 GolangPerl で Ninjable(ってなんだよ)なインターフェースを定義する

1.1.1 Golang

package ninjable

type Ninjable interface {
Nanja()
}

1.1.2 Perl

package Ninjable;

use strict;
use warnings;

use Role::Tiny qw/ requires /;

requires qw [[ Nanja ]] ;

1.2 GolangPerlNinjable を満たす何かを実装する (だから Ninjable ってなんだ)

1.2.1 Golang

package ninjable

type MASAKARINinja struct {
Ninjable
}

func (masakari *MASAKARINinja) Nanja() {
panic(`コードを書け、解釈してやる。慈悲はない`)
}

1.2.2 Perl

package MOHIKANNinja;

use strict;
use warnings;
use utf8;

use Role::Tiny::With qw/ with /;

with qw [[ Ninjable ]] ;

sub Nanja {
die "ひでぶ";
}

2. まあ僕はこんな感じでマッピングして最初の方は乗り切りました

えー、サンプルコードが Ninjable というワケの分からないサンプルなのは気にしない方向で(ぉ


まあ簡単にざっくりと言ってしまうとですね、

  • Golang の struct 型 と interface 型への理解の仕方

というのは、

  • Perl における Role::Tiny::WithRole::Tiny への理解の仕方

と、 同質ではないか な、と僕は勝手に思っています。というか僕は今でもそれで理解しています。

んで、ぶっちゃけ Golang にしても Perl にしても、

  • Role based Programming (勝手に名付けた)

を習得していないと、多分に罠踏んづけて踏み抜いて爆発する結果となると思うんですが、基本的に、 Perl を書いてきた方であれば、Golang のアレは、

Moose::Role とか Mouse::Role とか Moo::Role とか Role::Tiny っぽいモノだけを使ってプログラミングするアレだ!

と感じたら良いのではないかなぁ、と。

まあでも。

なるほど分からんって感じな説明だとは思いますけどね。これ (>_<;)

というコトで以上

久しぶりにプログラマーっぽいコトを書きましたです。はい。

特にオチなどはないです。

終わります。

FIXME