Edited at

A Tour of Go memo basics_1 (パッケージ, 変数, 関数)

More than 1 year has passed since last update.


Goについて


test.go

package main //Goのパッケージ宣言 main関数を制作することを 宣言する。

import ( //* 1
"fmt"
)

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


これがGoの最初の構文

1. インポート部

import部は単一行やグループ、また相対や絶対パスでのしていなど複数のインポート手法がある。

*インポートに関するQiita

ここでimportされているfmtパッケージについて下記にまとめる。

fmt : fmtパッケージはフォーマットI/Oを実装しているC言語におけるprintf/scanfに似た関数を持つ書式パッケージ


packages (パッケージのインポート)

GoLangのプログラムはパッケージで構成されていて、プログラムのはじめはMainパッケージから開始される。

規約的には,パッケージ名がインポートパスの最後の要素と同じ名前になる。

例として"math/rand"package randのステートメントで始まるファイル群で構成されます。


Imports


sample.go

import (

"fmt"
"math"
)

importsのグループ化は括弧を使うことによってできる。これをfactored import statementといいます。多くのimportがある場合はこちらのほうがいいコーディングといえます。

このグループ化は下記のように単行で記載できます。


sample.go

import "fmt"

import "math/rand"


Exported names (エクスポート用の名前)

Goで最初の文字が大文字で始まる名前はPublic属性がぐよされExportができるようになります。この際に参照するExportするnameがExported nameと言います。

 


Functions (関数)

どの言語にも存在する関数ですが、Goではこのように書く。


sample.go

package main 

import "fmt"

func add (x int, y int) int {
// func 関数名 (引数名1 引数型,・・・,引数名n 引数型) 返り値型
return x + y
}

func main () {
fmt.Println(add(42, 13))
}


この例で考えてみると引数の後ろに引数の型が記載されることがわかる。

同じ型数が連続する場合はこのように記載できる。


sample.go

//~~~中略~~~

func add (x,y int){
return x + y
}


Multiple results (複数戻り値)

GOoでは複数の戻り値を返すことができる。

例として


sample.go

package main

import "fmt"

func swap (x , y string)(string, string){
return y, x
}

func main () {
a, b := swap ("hello","world")
//複数戻りの場合は ":="を利用する
fmt.Prinln (a, b)
}


この戻り値記載の場合は、returnの変数名を直接指定し戻り値として指定しています。

ですが、このような方法以外にも戻り値を返す方法があります。


Named return values (名前付きの戻り値)

名前付きの戻り値は関数の最初に戻り値部で定義した変数名を返します。

この名前付きの戻り値を利用することで関数のドキュメントとして表現できるようになります。


sample.go

package main

import "fmt"

func setInfo (student,clas string,age int) (x,y string, z int) {
x = student
y = clas
z = age
return
}

func main() {
x,y,z := setInfo("Hogeta Hoge","1A",20)
fmt.Println(x,"\n",y,"\n",z)
}


この名前付きの変数の場合は短い関数の際に利用すべきです。理由として、長い関数で利用すると戻り値の最終結果の確認などの可読性に悪影響をもたらすためです。


Variables (変数宣言)

var statementを利用して変数宣言を行えます。この変数の宣言は関数の引数リスト同様や戻り値リスト同様に、変数の最後に型を書くことによって型宣言も可能になります。

またvar宣言はfnction内でも利用できます。


whith initializers

初期値の設定の方法としてvar宣言の後に値を設定できます。


Short variable declarations (暗黙の型宣言)

関数内での、var宣言ではvarの代わりに:=を使用することも可能です。これを暗黙の型宣言といいます。

関数外でこれを利用することはできません。


sample

例として下記にsampleを張っておきます


sample.go

package main

import "fmt"

var name, school, clas string = "hoge", "hoge high_school", "1A"

func main () {
var age int = 20
fmt.Println(name, school, clas, age)
}



Basic types ( 基礎型(組み込み型) )

Goの型タイプには下記のものがあります





型種別
Go内型




Boolean
bool




String
string




Int
int, int8, int16, int32, int64




uInt
uint, uint8, uint16, uint32, uint64, uintptr




Byte
byte (int8の別名)




Rune
rune (int32の別名 Unicodeのコードポイント)




Float
float32, float64



書式文字列

ここ見たらわかるけどGoだと下記の感じで使ってることが多い。



%T

対象データの型情報を埋め込む

%v

デフォルトフォーマットで対象データの情報を埋め込む

%q

%+[書式]

構造体を出力する際に、%vの内容にフィールド名も加わる

%#[書式]

Go言語のリテラル表現で対象データの情報を埋め込む


Type conversions(型変換)

型変換は意外と簡単なもので下記のように行います


sample.go

//~~~前略~~~

func main() {
var x int = 1
y := uint(x)
z := float32(x)
fmt.Println(x, y, z)
}


Type inference(型推論)

型推論は書式文字列で%Tを使うことで可能になります


Constants (定数)

変数はconstのみで宣言できる。使えるものとしてcharacter,string,boolean,numericのみです。


Numeric Constants

package main

import "fmt"

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 << 105
// 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))
}

(定数について)[https://qiita.com/hkurokawa/items/a4d402d3182dff387674]