Open7
新米フロントエンドエンジニアがGO言語に入門する
モダンなgolangとやらをやろうと思う
やる理由はモダンというだけで十分
それがWeb系エンジニアの宿命である
Go言語とは
Go言語は2009年に誕生した比較的に新しい言語.
静的型付けに対応していたり,メモリ安全性が高い、コンパイル言語.
メモリ破壊が無く,並行処理を得意しているC言語の上位互換のような感じらしい.
書き方の幅が広くないので,誰が書いても似たようなコードになるのが特徴.
Goというと意味が広すぎるので,英語ではgolangとされることが多い.日本語ではGo言語.
開発環境
- macOS
- Visual Studio Code
- Google Chrome
環境構築(goのダウンロード)
公式からもダウンロードできる
MacでHomebrewを使っているので,プログラミングで使用するものはこれで管理したいので,私はこちらでダウンロードします.
brew install go
いずれも,終わったら
go version
と打ってバージョンが表示されて言えば良さそう.
nob1mac@nob1mac ~ % go version
go version go1.17.2 darwin/arm64
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じゃなきゃダメなのかな?
ちなみに
Goの文字列は''
で囲うのはダメで,""
で囲うことしか許されない.
ここからは学んだことをセクションにわけてコードをただ貼ってくだけにする.(メモ程度)
/*
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
/*
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