見出し画像

[学習メモ]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など、他の言語ですでに慣れ親しんでいる構文については飛ばして進めていく予定です。(気になるところがあればピックアップしてメモに残します。)

この記事が気に入ったらサポートをしてみませんか?