[学習メモ]A Tour of Go[Basics:Packages, variables, and functions]
学習記録です。
Webプログラマーになって、というかPHPを書いて2年になるので、そろそろ静的型付け言語を学びたいなと思いました。
静的型付け言語の中でも学習コストが低そうで、楽しそうという理由でGolangを学びます。
目標はさくっとWeb APIをGolangで開発できるようになりたいです。
とりあえずA Tour of Goをさらっとやっていきます。
Packages
package main //これ
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}
https://note.crohaco.net/2019/golang-package/
A Tour of Goをみてもあまりピンとこなかったので↑の記事で保管
PHPで言うところの名前空間みたいな感じかな?
imports
パッケージのインポートを行う。
複数パッケージをインポート
//複数パッケージをインポート
import (
"fmt"
"math"
)
//分けてインポートも可能
import "fmt"
import "math"
Exported names
引用 Goでは、最初の文字が大文字で始まる名前は、外部のパッケージから参照できるエクスポート(公開)された名前( exported name )です。 例えば、 Pi は math パッケージでエクスポートされています。
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println(math.Pi) //外部パッケージのメソッドなので大文字から始まっている'Println', 'Pi'
}
これ絶対忘れそうですね.........
Functions
func add(x int, y int) int {
return x + y
}
func 関数名(変数名 型,変数名 型) 戻り値の型 {
return 戻り値
}
変数名の後ろに型名を書く
Functions continued
同じ型の引数は最後の型を残して省略可能
通常の引数宣言↓
x int, y int
省略↓
x, y int
Multiple results
関数の戻り値を複数選択
func swap(x, y string) (string, string) {
return y, x
}
PHPをメインに書いているので、こういった書き方ができるのは目新しく感じます。
PHPでは配列や連想配列にして返していた部分を、個々の変数で返すことができるのは画期的だなと思いました。
Named return values
引用 Goでの戻り値となる変数に名前をつける( named return value )ことができます。戻り値に名前をつけると、関数の最初で定義した変数名として扱われます。
func split(sum int) (x, y int) {
// x, y戻り値として宣言している ↑
x = sum * 4 / 9
y = sum - x
return
}
Go独特な構文でちょっと?が浮かんでしまいました。。。w
参考文献
https://medium.com/eureka-engineering/named-return-values-7f485d867df0
https://postd.cc/golang-internals-part-2-nice-benefits-of-named-return-values/
http://www.ushiblo.com/programming/go/%E3%80%90go%E8%A8%80%E8%AA%9E%E3%80%91named-return-values-%E3%81%A0%E3%81%A3%E3%81%A6%E3%81%AD/
Variables
引用 var ステートメントは変数( variable )を宣言します。 関数の引数リストと同様に、複数の変数の最後に型を書くことで、変数のリストを宣言できます。
JavaScriptみたいですね。。。w(phper並の感想)
Variables with initializers
値を初期化する
var i, j int = 1, 2
func main() {
var c, python, java = true, false, "no!"
fmt.Println(i, j, c, python, java)
}
Short variable declarations
varの省略として:=を使用する。
暗黙的な型宣言ができる(自動で型を設定してくれる?)
関数の外では使用できない。
Basic types
Golangで使用される基本的な型
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 の別名
rune // int32 の別名
// Unicode のコードポイントを表す
float32 float64
complex64 complex128
runeだけは馴染みがないので、後ほど詳しく調べたいと思います。
Zero values
初期値を与えずに宣言した時に自動で入る値
変数に初期値を与えずに宣言すると、ゼロ値( zero value )が与えられます。
ゼロ値は型によって以下のように与えられます:
数値型(int,floatなど): 0
bool型: false
string型: "" (空文字列( empty string ))
Type conversions
型変換
i := 42
f := float64(i)
u := uint(f)
Type inference
型推論
i := 42 // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128
Constants
定数
定数は、文字(character)、文字列(string)、boolean、数値(numeric)のみで使えます。
const Pi = 3.14
func main() {
const World = "世界"
fmt.Println("Hello", World)
fmt.Println("Happy", Pi, "Day")
const Truth = true
fmt.Println("Go rules?", Truth)
}
Numeric Constants
数値の定数は高精度な値となる(高精度とは?桁数の大きい数字を保持することができる?)
const (
// Create a huge number by shifting a 1 bit left 100 places.
// In other words, the binary number that is 1 followed by 100 zeroes.
Big = 1 << 100
// Shift it right again 99 places, so we end up with 1<<1, or 2.
Small = Big >> 99
)
func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
return x * 0.1
}
func main() {
fmt.Println(needInt(Small))
fmt.Println(needFloat(Small))
fmt.Println(needFloat(Big))
}
OUTPUT
21
0.2
1.2676506002282295e+29
以上がPackages, variables, and functions.のレッスン内容になります。
感想としては、やはり型って難しそうだなと感じました。が、同時にPHPを触っているときとは違う高揚感もあり、早く基本構文の学習を終わらせてGolangでなにか開発したいという思いも強くなりました。
とりあえず明日以降もA Tour of Goを続けていきたいと思います。
ifやforなど、他の言語ですでに慣れ親しんでいる構文については飛ばして進めていく予定です。(気になるところがあればピックアップしてメモに残します。)
この記事が気に入ったらサポートをしてみませんか?