Open7

新米フロントエンドエンジニアがGO言語に入門する

Knob/のまど先生Knob/のまど先生

モダンなgolangとやらをやろうと思う

やる理由はモダンというだけで十分
それがWeb系エンジニアの宿命である

Go言語とは

Go言語は2009年に誕生した比較的に新しい言語.

静的型付けに対応していたり,メモリ安全性が高い、コンパイル言語.

メモリ破壊が無く,並行処理を得意しているC言語の上位互換のような感じらしい.

書き方の幅が広くないので,誰が書いても似たようなコードになるのが特徴.

Goというと意味が広すぎるので,英語ではgolangとされることが多い.日本語ではGo言語.

開発環境

  • macOS
  • Visual Studio Code
  • Google Chrome
Knob/のまど先生Knob/のまど先生

環境構築(goのダウンロード)

公式からもダウンロードできる
https://golang.org/dl/

MacでHomebrewを使っているので,プログラミングで使用するものはこれで管理したいので,私はこちらでダウンロードします.

brew install go

いずれも,終わったら

 go version

と打ってバージョンが表示されて言えば良さそう.

nob1mac@nob1mac ~ % go version
go version go1.17.2 darwin/arm64
Knob/のまど先生Knob/のまど先生

goコマンドを実行する

適当にファイルを作って実行してみます

mkdir lesson-go
touch main.go

main.goにこう書きます.

package main

import "fmt"

func main() {
	fmt.Print("Hello go!!")
}

いざ実行

go run main.go

コンソールにHello go!!が出たら成功です!

考察
package main...なんか必要みたい
import "fmt"...出力に使用している(文字や数などを扱う場合に使用.つまり大体の場合は必要?)
main()という関数が自動で実行される仕様のようだ
ちなみにpackage mainのmainと関数の名前のmainを書き換えてもダメだった.
mainじゃなきゃダメなのかな?

Knob/のまど先生Knob/のまど先生

ここからは学んだことをセクションにわけてコードをただ貼ってくだけにする.(メモ程度)

Knob/のまど先生Knob/のまど先生
/*
	01. Consoleに出力する
	scriptの実行: $ go run lesson01.go
*/
package main

import "fmt"

/*
	POINT:
	文字列は
	"..."で囲む(ダブルクォーテーション○)
	'...'は不可(シングルクォーテーション×)
*/

/* goのファイルは常にmain()という関数が,書かれており,それが実行される仕組みである */
func main() {
	/* Print ...出力 */
	fmt.Print("hello, ")
	fmt.Print("world.\n") // `\n` をつけないと改行されない

	/* Println ...改行が含まれる 常用しそう */
	fmt.Println("hello, Println1")
	fmt.Println("hello, Println2")

	/* Sprint ...文字列を返す */
	hello1 := fmt.Sprint("Sprint", "Hello", "world!", "複数可能", "スペースが入らない")
	fmt.Println(hello1)
	hello2 := fmt.Sprintln("Sprintln", "Hello", "world!", "複数可能", "スペースが入る")
	fmt.Println(hello2)
	// `hello1 :=` は定数宣言の書き方(次回の説明で解説)

	/* printf ...フォーマットを使用 */
	myName := "Steve nobs"
	myAge := 200
	fmt.Printf("myName is %v.", myName)                                  // 変数を出力に組み込む
	fmt.Printf("myName is %v. %v が大好きです。%v 才\n", myName, "やきいも🍠", myAge) // %vで値が順番に入っていく
	fmt.Printf("%#v\n %#v\n %#v\n", myName, "やきいも🍠", myAge)              // Goの文法で表示する
	fmt.Printf("%T\n %T\n %T\n", "文字列", 123, false)                      // 型を表示する
	fmt.Printf("単に%%を記号として出力したいとき")                                      // 記号の%を使いたいとき
}

// 参考

// いろんなprint
// https://qiita.com/taji-taji/items/77845ef744da7c88a6fe

// printfのフォーマットの書き方
// https://qiita.com/rock619/items/14eb2b32f189514b5c3c

Knob/のまど先生Knob/のまど先生
/*
	02. 変数宣言
	scriptの実行: $ go run lesson02.go
*/
package main

import "fmt"

/* 変数定義(変更可能) */
var message string = "やあ、俺はゴウだ。よろしく。" // 型annotationあり(型は小文字始まり)

// 型推論も可能
var str = "ここにはstringが入るってわかってんだろ"

/* 複数の同時宣言 */
var foo, bar, buz string = "foo", "bar", "buz"
var n1, n2, n3 = 1, 2, 3

// 同じ型で複数宣言する場合
var (
	a string = "aaa"
	b        = "bbb"
	c        = "ccc"
	d int    = 123 // こいつだけ int
	e        = "eee"
)

/* 型の種類 */
var (
	word    string  // 文字列
	num1    int     // 整数
	num2    int8    // 8bit整数(-128〜127)
	boolean bool    // true/false
	float1  float32 // 小数点付き数値
	float2  float64 // 小数点付き数値
) // 他にもいろいろある

func main() {
	fmt.Println(message) // global で定義した message を使用
	printMessage()       // 1度目

	/* 関数内で再宣言可能*/
	message := "いや、俺はGo" // `:=` は関数内で再宣言するときに使用できる
	// var message string = "いや、俺はGo" // こう書いても良い

	fmt.Println(message) // 再宣言された message を使用
	printMessage()       // 2度目(こちらは変更されていない)

	/* 定数宣言(変更不可) */
	const name_c string = "progLearning"
	// name_c = "progLearning2" // const で宣言したので変更不可
	message = "いや、私がGoだ" // var で宣言したので変更可能

	/* 型の検証 */
	fmt.Printf("%T\n%T\n%T\n%T\n%T\n%T\n", word, num1, num2, boolean, float1, float2) // 空文字列

	/* 初期値に関して */
	fmt.Printf("%#v\n%#v\n%#v\n%#v\n%#v\n%#v\n", word, num1, num2, boolean, float1, float2) // それぞれ初期値が定義されている
}

func printMessage() {
	fmt.Println(message) // global で定義した message を常に使用
}

// 参考

// 数値の型
// https://qiita.com/tanaka0325/items/9c61a022cd32be0c65a6