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

# Goについて
```test.go
package main //Goのパッケージ宣言 main関数を制作することを　宣言する。

import ( //* 1
    "fmt"
)

func main () {
    fmt.Println("Hello Go lang!")
}
```
これがGoの最初の構文
1. インポート部
import部は単一行やグループ、また相対や絶対パスでのしていなど複数のインポート手法がある。
[*インポートに関するQiita](https://qiita.com/megu_ma/items/f5e66293b2934e117731)
ここで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の型タイプには下記のものがあります
<table>
    <tr><th>型種別</th><th>Go内型</th></tr>
    <tr><td>Boolean</td><td>bool</td></tr>
    <tr><td>String</td><td>string</td></tr>
    <tr><td>Int</td><td>int, int8, int16, int32, int64</td></tr>
    <tr><td>uInt</td><td>uint, uint8, uint16, uint32, uint64, uintptr</td></tr>
    <tr><td>Byte</td><td>byte (int8の別名)</td></tr>
    <tr><td>Rune</td><td>rune (int32の別名 Unicodeのコードポイント)</td></tr>
    <tr><td>Float</td><td>float32, float64</td></tr>
</table>

# 書式文字列 
[ここ見たらわかる](http://www.k-cube.co.jp/wakaba/server/format.html)けど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
```go
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]