こんにちは、エンジニアの東です。
今回は「PHPerが学ぶGo Tour」という題目通り、
Tour of GoをPHP使いが学ぶ上での言語の違いを書いていきたいと思います。
なぜこの記事を書くに至ったか。それは弊社では言語にGoを採用しておりますが、
慣れ親しんだ言語とは別に新しい言語を扱うのは、非常に戸惑うことが多いと思います。
筆者自身もよく、GoとPHPを行き来するため、PHPでセミコロン忘れやGoで変数定義で$piyoと書いてしまい、
「動かない…なんでー…」っと、小恥ずかしいミスをしまったこともあります。
なかなか新しい言語を使うのにはその言語をなれるまで結構大変です。
また、Tour of Go は他言語を学んでいる前提でのサイトです。
しかし、Go言語は他言語と勝手が違うことが多く、導入に戸惑う点も多々あると思います。
まず、言語に触れてみるのが大事だと思いますのでざっくり大雑把にTour of GoのソースをPHPで書いたらこんな感じですって紹介していきたいと思います。
※ Goに関する説明は本家サイトであるTour of Goにありますので、そちらをすすめながら、同時にこちらの記事をみていただければと思います。
※ 本記事は、導入のしやすさを重視するため、正しくは異なるような、誤解を与える表現が含まれていることがございます。ご了承いただければ幸いです。
Hello World!
定番のHello World!
この段階では、おまじないな書き方ですが、それはGo tourが後々説明してくれています。
package main
import "fmt"
func main() {
    fmt.Println("Hello, 世界")
}
(引用: https://go-tour-jp.appspot.com/welcome/1)
1.phpのHello world!
print("Hello, 世界\n");
2.php goに似せてみた場合
namespace main;
class Main
{
    static function main()
    {
        print("Hello, 世界\n");
    }
}
Main::main();
Packages
パッケージとimport
パッケージは、他言語でいうところの名前空間に近いです。
package main
import (
    "fmt"
    "math/rand"
)
func main() {
    fmt.Println("My favorite number is", rand.Intn(10))
}
(引用: https://go-tour-jp.appspot.com/basics/1)
1.phpで書く場合
print('My favorite number is '.mt_rand(0, 10));
2.php goに似せてみた場合
namespace main;
// PHPで標準関数なので、本来書きませんが、goのimportはphpでいうuseに近いです。
// use Math; 
// use String;
class Main
{
    static function main()
    {
        print('My favorite number is '.mt_rand(0, 10));
    }
}
Main::main();
関数
関数
引数の型が後ろにつくのは独特ですね。
package main
import "fmt"
func add(x int, y int) int {
    return x + y
}
func main() {
    fmt.Println(add(42, 13))
}
(引用: https://go-tour-jp.appspot.com/basics/4)
namespace main;
class Main
{
    protected function add(int $x, int $y) : int
    {
        return $x + $y;
    }
    static function main()
    {
        print(self::add(42, 13));
    }
}
Main::main();
2値以上返却する関数
2値以上返却するのは既存コードを書きかえるときにシンプルにしやすいですね。
package main
import "fmt"
func swap(x, y string) (string, string) {
    return y, x
}
func main() {
    a, b := swap("hello", "world")
    fmt.Println(a, b)
}
(引用: https://go-tour-jp.appspot.com/basics/4)
PHPの場合2値以上返却できないので下記な感じしょうか。
namespace main;
class Main
{
    protected function swap(string $x, string $y) : array
    {
        return [$y, $x];
    }
    static function main()
    {
        list($a, $b) = self::swap("hello", "world");
        printf("%s %s", $a, $b);
    }
}
Main::main();
基本の型(ゼロ値)
ゼロ値はGo特有なのでPHPでどのように記述するかはないですが、PHPでは基本的に全て初期化して使っていると思えば良いかと思います。
package main
import "fmt"
func main() {
    var i int
    var f float64
    var b bool
    var s string
    fmt.Printf("%v %v %v %q\n", i, f, b, s)
}
(引用: https://go-tour-jp.appspot.com/basics/12)
$i = (int)0;
$f = (float)0.0;
$b = false;
$s = '';
printf("%d %f %b %s", $i, $f, $b, $s);
いかがだったでしょうか
今回はGoの基礎をPHPに絡めて紹介しました。
次回は制御構文を紹介したいと思います。
 
                                 
                                                