search
LoginSignup
1
Help us understand the problem. What are the problem?

posted at

updated at

Go 基礎

はじめに

業務で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]

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
    }
}

レシーバ

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

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
}

ポインタ

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

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

datetimeについて

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

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

ドット3つ

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

go generate ./...

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?