💨

Go 基礎

2022/05/03に公開
2

はじめに

業務でgoを用いて開発をおこなった際に、基礎的な文法等について不明であった点について自身の頭の中を整理するために記事にまとめました。
メモ書きのような形式で記事にしているので、網羅性に欠ける部分が存在する点についてはご了承ください。

基礎文法

  • _(アンダーバー)は、アンダースコア変数と呼び、宣言はするが後で使用しない変数を意味する。

  • アンダースコア変数を使用してスライスの中身を取り出す。

for _, value := range values {
    fmt.Println(value)
}
  • スライスからkeyとvalueを取り出す。
for key, value := range values {
    fmt.Println(key)
    fmt.Println(value)
}

slice

var list1 []string
var list2 []int
var list3 []byte

list4 := []string{"test1", "test2"}
fmt.Println(list4) // [test1 test2]

https://qiita.com/k-penguin-sato/items/daad9986d6c42bdcde90#slicesスライス

sliceに要素を追加する

  • 基本
newSlice = append(slice, 追加要素)
  • 応用
	var keys []*genproto.Archive
	for _, v := range archives {
		operatorcomaster, _ := v.QueryOrganization().Only(ctx)
		po := toProtoArchive(v, operatorcomaster)
		keys = append(keys, po)
	}

slice及びmapを取得するループ処理

slice

var slice = []string{"Golang", "Ruby", "Javascript", "Python"}

func main() {
    for index, value := range slice {
        fmt.Println(index, value)
        //=> 0 Golang
        //=> 1 Ruby
        //=> 2 Javascript
        //=> 3 Python
    }
}

map

var mapping = map[string]int{
    "one":   1,
    "two":   2,
    "three": 3,
    "four":  4,
    "five":  5,
}

func main() {
    for key, value := range mapping {
        fmt.Println(key, value)
        //=> four 4
        //=> five 5
        //=> one 1
        //=> two 2
        //=> three 3
    }
}

https://qiita.com/k-penguin-sato/items/a320072fa09502bde3e9#range-for-の-range節

レシーバ

関数外で定義した構造体などをレシーバを通して受け取り、関数内で使用することができる。
値レシーバとポインタレシーバが存在する。

type Greet struct {
	greet string
}

func (s Greet) translate() {   // 変数レシーバ
	s.greet = "hello"
}

func (s *Greet) translate2() { // ポインタレシーバ
	s.greet = "hello"
}

func main() {
	str := Greet{"こんにちは"}

	str.translate()
	fmt.Println(str.greet) // こんにちは
	str.translate2()
	fmt.Println(str.greet) // hello
}

ポインタ

https://qiita.com/Sekky0905/items/447efa04a95e3fec217f

apiのuriからリクエストパラメータを取得する

var param string = r.FormValue("param1")

datetimeについて

	fileName := "operator_list." + time.Now().Format("20060102") + ".csv"

https://qiita.com/ruiu/items/5936b4c3bd6eb487c182

webサーバーを立ち上げる

  • main.goファイルの中で main 関数が一番最初に実行される
  • go run main.go でmain.goがコンパイルされたうえで実行され、api用のwebサーバーが立ち上がる。
main.go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

func main() {
	StartWebServer()
}

func StartWebServer() {
	fmt.Println("Start Web Server")
	http.HandleFunc("/getUser", getUser)
	http.ListenAndServe(fmt.Sprintf(":%d", 60000), nil)
	return
}

func getUser(w http.ResponseWriter, r *http.Request) {

	var user_name string = "taro"

	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(user_name)
}

go mod

go moduleの初期化

go mod init <project-name>

### 公開前提の場合はモジュールのパスを指定する
$ go mod init github.com/nishina555/go-example

指定したパッケージのinstall

個別にパッケージをインストールする場合

go get [パッケージ名]

依存モジュールを一括ダウンロードする

go mod tidy

バイナリ形式の実行ファイルを$GOPATH/bin以下にインストールする

go install

https://zenn.dev/optimisuke/articles/105feac3f8e726830f8c

ドット3つ

指定したディレクトリ以下の全てのファイルを意味する。

go generate ./...

https://ja.stackoverflow.com/questions/40796/go-getのurl-というトリプルドットはどういう意味ですか

Discussion

tenkohtenkoh

go installはバイナリ形式の実行ファイルを$GOPATH/bin以下にインストールするためのものです。依存モジュールを一括ダウンロードするのであればgo mod tidyしてあげれば良いです。

takuyanagai0213takuyanagai0213

コメントありがとうございます!!

参考にさせていただき、適宜記事に反映させていただきたいと思います!