カラクリサイクル

『輝かしい青春』なんて無かった人の雑記

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^)