DX

PythonユーザーがGo言語に挑戦。チャレンジGo 〜入門編〜

Golang_challenge
by Renée French

■目次

  1. はじめに
  2. Goのユースケース・特徴
  3. Goをインストール
  4. 基本文法
    1. packageとimport
    2. 変数の宣言
    3. 関数
    4. for文・if文・switch文
    5. ポインタ
    6. struct (構造体)
    7. Goroutine
  5. まとめ

はじめに

mfield Company ICT本部で業務アプリケーションエンジニアをしているイシピです。
好きな色はオレンジです。
業務では主にPythonを利用することが多く、他の言語についても理解を深めるため、昨年からGo言語の学習を始めてみました。

本記事は、Goに興味を持たれている方向けの入門記事となります。
公式で紹介されているユースケースや、基本文法の特徴的な部分などをご紹介していければと思います。

はじめにGoの概要を説明いたします。
Goは2007年にGoogleで作成された、オープンソースのプログラミング言語です。大規模な製品とサービス構築に多く利用されています。
公式サイト:https://go.dev/

ちなみに、メインビジュアルに利用されているのは、Go公式キャラクター「gopher」。
キャラクターにもご興味がある方には「gopher」の歴史を知ることができるこちらの記事がお勧め。

Gopher
by Renée French

2. Goのユースケース・特徴

・クラウド&ネットワークサービス
・コマンドラインインターフェース
・WEB開発
・DevOpsとサイトの信頼性

上記4点が多く見られるGoのユースケースです。

開発元のGoogleはもちろんですが、NETFLIX、Twitterなどの有名サービスもGoを利用しています。
参考 : What’s possible with Go

NETFLIXのnetflixtechblogでは、Goを利用した理由として以下のコメントが記載されています。

「Javaよりもレイテンシが低く(ガベージコレクションの一時停止が問題になる)、C言語よりも開発者にとって生産性が高く、数万のクライアント接続も処理できるものが必要だった。」

netflixtechblog


このコメントからもわかるように、Goの特徴として以下の3点が挙げられます。

・早く簡潔であること
Goはコンパイル時に中間言語に変換されることなく、そのまま機械言語に変換されるため、高速コンパイルが可能。また、並行ガベージコレクタにより、プログラムと並行にガベージ処理されるため、実行時の早さも特徴です。

・開発者にとって使いやすいこと
もともとGoogle社内で使われていたこともあり、開発者のニーズを考えられた設計になっています。

・並行処理に優れていること
GoにはGoroutineと呼ばれる並行処理の仕組みがあり、関数の呼び出しの前に “go” を付けると関数を並行して実行可能です。

3. Goをインストール

Goは公式サイトのダウンロードページ、またはトップページからインストール可能です。
ダウンロードページはこちら

以下インストール対応OS
・Windows
・MacOS
・Linux

公式ドキュメントからLinux、Mac、Windows版のインストール手順がそれぞれ出ているため、こちらを参考にするのが間違いないかと思います。

こちらがそのドキュメント

ダウンロードせずにブラウザ上で動かしてみたい方には、Go Playgroundをお勧めします。CPUおよびメモリの使用量などの制限はあるものの、その名の通りGoに触れるための遊び場として、特に問題なく使用可能。

go_playground
Go Playground:https://go.dev/play/

4. 基本文法

ここからはGoの基本文法を紹介します。

4-1. packageとimport

Goのプログラムはパッケージによって構成され、main()から実行されます。
以下は「Hello World!」を出力する単純なプログラムの例です。

・mainパッケージの宣言から開始
・importでfmtパッケージをインポート
・main()に「Hello World!」を出力させる記述

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello World!")
}

出力結果は

Hello World!

となります。

4-2. 変数の宣言

・明示的な宣言
変数を指定するための基本形は以下です。

var [変数名] [変数の型]

例えば、数値型の変数:xを指定する場合

var x int 

となります。

・暗黙的な宣言
明示的には上記のように宣言しますが、Goでは暗黙的に型宣言することも可能です。

その場合は、

[変数名] := [値]

として宣言します。

数値型の変数:xの値が10である場合、宣言の仕方は以下のようになります。

x := 10

※暗黙的な型宣言は関数の中でのみ可能

4-3. 関数

4-1ではmain()が出てきましたが、今度は別の関数sample()を定義します。

例えば、int型のxを返すsample()を定義する場合以下のように記述します。

func sample(x int) int {
	return x
}

変数名の後ろには、型を記載する必要があります。
この例の場合は「変数:x」の後ろに「型:int」を記載しています。

4-4. for文・if文・switch文

プログラミングの代表的な文法について、Go言語ではどのように記述するのかをご紹介致します。

・for文
Goのfor文はC言語やJavaと異なり、forの条件式となる()の部分がありません。

Javaの場合

for (初期化式; 条件式; 後処理条件式){
  //条件式に従い実行される処理
}

Goの場合

for 初期化式; 条件式; 後処理条件式{
     //条件式に従い実行される処理
	}

Goの場合は、「;」で区切られたフィールドが条件式となります。

この「;」は条件式だけを記述する場合省略も可能。

・if文
if文の場合も、条件式に()は利用せず、「;」によって記述されます。
こちらも条件式のみを記述する場合は「;」は不要です。

if 初期化式; 条件式; 後処理条件式 {
		//条件式に従い実行される処理
	}

・switch文
switch文について他言語との大きな差は、breakの記述がいらない部分。
また、swichに設定される各caseは定数である必要がなく、caseの関連する値が整数でなくとも取り扱いが可能です。例えば、式や文字列であっても指定可能。

switch 変数 {
case 設定される値1:
処理1
case 設定される値2:
処理2
}

デフォルトでは、上記の例の場合「case 設定される値1」に条件が一致し実行されると、その後の処理2は実行せずに終了します。しかし、fallthrough機能を利用すると続けてその後のcaseの処理が可能です。

switch 変数 {
case 設定される値1:
処理1
fallthrough
case 設定される値2:
処理2
fallthrough
default:
処理3   ※最終的な処理
}

全てのcaseに条件一致した場合、処理1、2、3が実行され、どのcaseにも条件一致しなかった場合は、defaultに設定した処理3のみが実行されます。

4-5. ポインタ

Goは値のメモリアドレスであるポインタを扱います。

この変数のポインタを扱いたい場合

var x int = 10

例えばmain()の中に、以下を記述します。

var x int = 10
fmt.Println(x)
fmt.Println(&x)

この時の出力結果は

10
0xc000018030 

また、以下も同じ出力結果となります。

var p *int = &x
	p = &x
	fmt.Println(p)
	fmt.Println(*p)

「*」をつけることによって、ポインタ型として扱うことができ、「p」は代入されたポインタを、「*p」はポインタpを通してxの数値を呼び出しています。

4-6. struct (構造体)

Goには他言語に見られるclassの概念がなく、同等の概念としてstruct(構造体)を扱います。

struct定義の基本形

type (構造体の名称) struct {
	(変数名) (型)
}

structに格納されたフィールドは「.」を利用して呼び出すことができます。

例えば「v.X」で構造体Vertexのフィールドであるint型のXを呼び出している、こちらのコードの場合、

type Vertex struct {
	X int
}

func main() {
	v := Vertex{1}
	v.X = 10
	fmt.Println(v.X)
}

出力結果は10になります。

4-7. Goroutine

Goの特徴として、Goroutineと呼ばれる並行処理の仕組みについて触れました。実際にGoroutineを利用し並行処理で関数を実行するためには、関数をgoステートメントに指定します。
※関数が終了するとそのGoroutineも終了し、 戻り値がある場合、関数の実行完了時に破棄されます。

以下は、5秒ごとに引数の文字列を出力する処理を3回まで繰り返すsample()をGoroutineで並行処理した例です。

func sample(s string) {
	for i := 0; i < 3; i++ {
		fmt.Println(s)
		time.Sleep(5 * time.Second)
	}
}
func main() {
	go sample("TEST1")
	sample("TEST2")
	fmt.Println("END")

上記のパターンの場合出力結果は、

TEST2
TEST1
TEST2
TEST1
TEST1
TEST2
END

となります。

まとめ

今回はGo言語の入門として、特徴や基本文法などを記載させていただきました。

まとめとして

・簡潔で扱いやすく低レイテンシー、大規模開発に利用されている言語である
・まず手軽に試してみたい方には、ブラウザで実行できるGoPlaygroundがオススメ
・他言語とは違う概念が存在する

この記事がGo学習スタートのはじめの一歩として、お役に立てれば幸いです。


あなたもAMBLで働いてみませんか?

AMBLは事業拡大に伴い、一緒に働く仲間を通年で募集しています。

データサイエンティスト、Webアプリケーションエンジニア、AWSエンジニア、ITコンサルタント、サービス運用エンジニアなどさまざまな職種とポジションで、自分の色を出してくださる方をお待ちしています。ご興味のある方は、採用サイトもご覧ください。

●AMBL採用ページ
-メンバーインタビュー (1日の仕事の流れ/やりがい/仕事内容)
-プロジェクトストーリー (プロジェクトでの実績/苦労エピソード)

●募集ページ
プリセールス/ エンジニア/クリエイター/ データサイエンティスト /営業・コンサルタント /コーポレート /サービス企画 /教育担当

ABOUT ME
イシピ
mfield Company ICT本部で業務アプリケーションエンジニアとして働いています。 趣味は銭湯・温泉に行くことです。