カラクリスタ

Perl使いがGolang使いになってPerl使いに戻ってきた感想

概要: と言うような話を書きたくなった


僕はしばらく前まで、

をメインにプログラミングしてたんだけど、 最近また Perl でもプログラミングを再開したので、 今日はその辺りの話を書いてみる。

Perl 使いから見た Golang

正直なところ、Golang の型システムってどうなの? っていうと、 Golang の型システムは、

  1. interface 型は、メソッドの引数/戻り値の定義しかできない Moo::Role みたいな感じ
  2. strcut 型は、 Moo で作ったクラスのような感じ

ととらえると、結構分かりやすいな、と僕は感じでいる。

で、Golang は静的型付けなわけだけど、この、

  • 静的型付け

っていうのは、僕は今回が初めてで、結構感激したというか、 ああ、静的型付けってこんなに便利なんだ! と思ったんだけれども、 この静的型付け、

  • 内部的に入出力の値を厳格に定めたい

という時には便利なんだけれども、ぶっちゃけると Web API のように、 フレキシブルな値を扱うにはかなり向いてない。

まあ Golang の場合、空の interface 型を定義すればなんかなるとは言え、 それでもまあ面倒と言えば面倒なので、 その辺りは Perl 等の動的型付けのほうが便利かなぁと思います。

Perl の便利なところ、不便な所

ぶっちゃけこれは Golang と真逆というか、フレキシブルなシステムや入出力を扱うには結構便利っちゃぁ便利だけど、きっちりと入出力の型を定めたい、という時には結構不便な気がする。

特に、構造体っぽいクラスを作りたいとき、Golang だと

type User struct {
Username  string
Email          string
}

と簡単にかけるけど、これが Perl でMoo使って書くと、

package MyApp::Structure::User;

use strict;
use warnings;

use Moo;
use MooX::Types::MooseLike::Base;

has usename => (
is   => 'rw',
isa => Str,
);

has email => (
is  => 'rw',
isa => Str,
);

という感じになるので、若干冗長かなぁと感じる。 だた、Perl の場合は、構造体っぽいクラスの値に対する Validation が、 Golang と比べて、かなり柔軟にかけるので、 その辺りはまあトレードオフかなぁと。

Perl と Golang の使い分け方について

まあ僕としては、

  • 入出力を厳格に定めたいプログラム → Golang

  • フレキシブルな構造にしたいプログラム → Perl

という感じではないか lang:ja と思ってます。

という訳で本日の小ネタというか個人的感想は以上。

Golang 楽しいれす(^q^)  Perl もたのしいれす(^p^)

#FIXME