M.Hiroi's Home Page

Go Language Programming

[ Home ]

WHAT'S NEW


CONTENTS

お気楽 Go 言語プログラミング入門、Puzzle DE Go!、Yet Another Golang Problems のフォントを Web フォント (Noto Sans JP, Noto Sans Mono) に変更し、印刷用の CSS を追加しました。Web ブラウザの印刷機能を使って PDF に変換することもできます。表示が崩れるときはフォント Noto Sans Mono CJK JP をインストールしてください。


お気楽 Go 言語プログラミング入門

CONTENTS

●入門編

●応用編

●電卓プログラム編


Puzzle DE Go!


Yet Another Golang Problems


はじめに

Go 言語は Google 社によって開発されているコンパイル形式のプログラミング言語です。2012 年 3 月にバージョン 1.0 がリリースされました。現在も活発に開発が行われており、最新 (2021 年 12 月時点) バージョンは 1.17.4 になっています。

Go 言語はシンプルな言語仕様で、コンパイル・実行速度が速いといわれています。C++ と違って Go 言語にはガベージコレクションがあり、クロージャや並列処理もサポートしています。クラスや継承といったオブジェクト指向機能はありませんが、構造体、メソッド、インターフェースを使って、オブジェクト指向プログラミングを行うことは可能です。使い方も簡単で、実行形式ファイルを作成するだけではなく、スクリプト言語のようにコンパイルしたあとすぐに実行することもできます。

ただし、Go 言語にはC言語で有名な「ポインタ」があります。プログラミング言語の学習には、どの言語にもいくつかの難関がありますが、C言語最大の難関がポインタと言われています。ポインタはコンピュータの基本 (特にメモリの概念) を正しく理解していれば、けっして難しい話ではありません。問題は、C言語のポインタが不適切な操作や演算によってプログラムを簡単に暴走させてしまうことです。その点、Go 言語のポインタはC言語のような危険な操作や演算が禁止されているので、C言語よりもずっと安全にポインタを使うことができます。

M.Hiroi は Go 言語でプログラミングするのは初めてです。Go 言語の特徴のひとつである goroutine と channel による並行プログラミングを目標に、簡単なプログラムを作りながら Go 言語を勉強していきたいと思っています。まあ、初心者が作るプログラムなので、Go 言語らしいプログラムは書けないと思います。間違いやお気づきの点がありましたらご指摘お願いいたします。たいしたことはできませんが、よろしければお付き合いくださいませ。

●ダウンロード

Go 言語は次のサイトからダウンロードできます。Windows 用のバイナリが用意されているので、とても簡単にインストールすることができます。

Unix 系 OS の場合、一番簡単な方法は OS のパッケージマネージャを使ってインストールすることです。たとえば、Ubuntu の場合は次のコマンドでインストールすることができます。

sudo apt install golang

Ubuntu 18.04 (WSL) の場合、少し古いバージョン 1.10 がインストールされます。最新バージョンをインストールしたい場合は、公式ページ Download and install の手順に従ってください。具体的には、アーカイブファイル (go1.17.4.linux-amd64.tar.gz) をダウンロードし、次のコマンドで /use/local に展開します。

sudo tar -C /usr/local -xzf go1.17.4.linux-amd64.tar.gz

あとはディレクトリ /usr/local/go/bin にパスを通すだけです。次のコマンドを実行してください。

export PATH=$PATH:/usr/local/go/bin

これでパスを通すことができます。上記のコマンドはファイル ~/.bashrc に追加しておくといいでしょう。

●簡単なベンチマーク

Go 言語はプログラムをネイティブコードにコンパイルするので、バイトコードにコンパイルする処理系よりもプログラムを高速に実行することができます。その実行速度ですが、たらいまわし関数を使って調べてみました。

リスト:たらいまわし関数 (Go 言語)

package main

import (
    "fmt"
    "time"
)

func tak(x, y, z int) int {
    if x <= y {
        return z
    } else {
        return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))
    }
}

func main() {
    s := time.Now()
    fmt.Println(tak(22, 11, 0))
    e := time.Now().Sub(s)
    fmt.Println(e)
}

ファイル名を tak.go とすると、シェル上で次のように入力すると実行ファイル tak を生成することができます。

$ go build tak.go

また、build のかわりに run を指定すると、プログラムをコンパイルしたあと、実行形式ファイルを作らないですぐに実行することができます。

$ go run tak.go
11
1.2142619s

それでは実行結果を示します。tak(22, 11, 0) を計算しました。使用した Go 言語のバージョンは 1.17.4 です。

表 : tak(22, 11, 0) の結果
処理系
SBCL (ver 1.4.5)6.38
LuaJIT (var 2.1.0-β)4.02
SML/NJ (ver 110.98)2.66
GHC (ver 8.8.4)1.96
Julia (ver 1.6.4)1.95
SBCL (最適化)1.57
GCC -O2 (ver 7.4.0)1.23
Go 言語 (ver 1.17.4)1.21
Scala (ver 2.13.5)1.07
ocamlopt (ver 4.05.0)0.97
Java (ver 11.0.10)0.95

Go 言語は SML/NJ, SBCL, Haskell よりも速い結果になりましたが、Java や OCaml にはかないませんでした。それでも、GCC と同程度の速度をたたき出しているのですから、Go 言語は大変優れたコンパイラ (処理系) だと思います。

初版 2014 年 2 月 1 日
改訂 2021 年 12 月 11 日

参考 URL

  1. The Go Programming Language (本家)
  2. Documentation - go.dev, (本家)
  3. A Tour of Go, (チュートリアル, 日本語版)

権利・免責事項など

『お気楽 Go 言語プログラミング入門』の著作権は筆者「広井誠 (Makoto Hiroi)」が保持します。無断使用や無断転載は禁止いたします。『お気楽 Go 言語プログラミング入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。

ただし、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi)」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。


Copyright (C) 2014-2024 Makoto Hiroi
All rights reserved.

[ Home ]