20200728のGoに関する記事は4件です。

[Go言語] 初心者必見シリーズ: マップ(Map)

マップ(Map)

Golangではハッシュテーブル(hash table)のことを map と呼びます。

キーと値の組を複数個格納し、キーに対応する値をすばやく参照するためのデータ構造です。

golang-map.png

定義方法

方法1

  • 構文
  変数名 := map[]{初期値1, ..., 初期値n}
  languages := map[string]string{
      "go":"golang", 
      "rb":"ruby", 
      "js":"javascript",
  }

方法2

  • 構文
  変数名 := make(map[], 容量)
  languages := make(map[string]string)
  languages["go"] = "golang"
  languages["rb"] = "ruby"
  languages["js"] = "javascript"

要素の挿入と更新

  • 要素の挿入や更新:
  languages := map[string]string{}
  languages["go"] = "golang" // "go"キーが存在する場合は、valueが "golang" に更新され、
                             //  存在しない場合は、("go", "golang") という Key-ValueのペアがMapに挿入される。    
  • 要素の取得:
   elem, ok := languages["go"] // "go"キーが存在する場合は、 ok == true
                               //          存在しない場合は、ok == false

golang-find.png

要素の走査 (iteration)

  • range でMapを走査できる。
  for key, value := range languages{
    ...
  }

注意: GoのMapのiterationは、

   要素がランダムに取得されるため、実行するたびに異なる結果になります。

要素の衝突

複数の異なるキーが同じバケットに入ることを衝突(collision)と呼びます。

GoのMapは衝突を起こしたキー同士をポインターでつなぎます。(連鎖法

golang-collision.png

動画

https://www.youtube.com/watch?v=HQuIjHZqNxI

元記事

https://aifan.jp/2020/07/28/Go%E8%A8%80%E8%AA%9E-%E5%88%9D%E5%BF%83%E8%80%85%E5%BF%85%E8%A6%8B%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%9E%E3%83%83%E3%83%97%EF%BC%88Map%EF%BC%89/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Goでの構造体埋め込みと、埋め込んだ構造体に構造体を代入する

構造体の埋め込みについてはよく書いてあるのだけど
埋め込んだ構造体に、埋め込んだ元の構造体を代入する方法があまりなかったのでメモ

埋め込み

    type A struct {
        A string
    }
    type B struct {
        B string
    }

    type C struct {
        *A
        *B
    }

代入

    a := new(A)
    b := new(B)
    c := new(C)

    a.A = "hoge"
    b.B = "hage"

    c = &C{B: b} // CにBを代入

代入済みのCにAを追加

    c = &C{
        A: a,
        B: c.B,
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

vscodeコンテナー環境でgo rename出来ない

実行環境

VSCode 1.47.3
Go 1.14.4
Remote-Containers v0.128.0

問題

「シンボルの名前を変更 F2」を行ったら、

Rename failed: gorename: can't find package containing /****/****/***.go
名前の変更を実行できませんでした。

解決

  1. ctrl + ,設定ページ開く
  2. 「go server」で検索する
  3. 一番下にGo:Use Language Serveをチェックする image.png
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go Gin Docker AWSで完璧なTodoアプリを作る

こんにちは。
今回は最近流行りのGoの勉強ついでにQiitaを書いてみようと思います。

普段はReactでのフロント開発やRailsでAPI開発などをしています。
社内でもRailsからGoへの書き換えが始まっている中で、Goってどうやって書くの?インフラわからないんだけどデプロイしてみたい!って軽い気持ちでサンプルアプリを作ってみたいと思います。
意外とローカルで動くものを作って終わりな記事が多いので今回はデプロイまで行うことをゴールとして開発していきます!!

使用技術

  • go
  • gin
  • go modules
  • mysql
  • docker
  • gorm
  • AWS

参考文献

Go / Gin で超簡単なWebアプリを作る
DockerでGoの開発環境を構築する

早速やっていこーう(環境構築)

(ここではgoのインストールは省略しまーす。)
まずやることはディレクトリの作成!

mkdir perfect_todo
cd perfect_todo

そして今回はgoのライブラリーを管理するためにgo modというものを使っていきます。これはどのライブラリーを入れたかを管理してくれるので、docker化した時や共同開発の時にとても便利らしい。。。

go mod init perfect_todo

これで go.modgo.sum というファイルが生成されたかと思います。

そしたら次にgoのフレームワークであるginをインストールしていきたいと思います。

go get github.com/gin-gonic/gin

go.mod をみてみてください。これで github.com/gin-gonic/gin が追加されていたらインストールが完了しています!

それが成功したら

touch main.go

でmain.goのファイルを作ります。このファイルが実行されて、ここでインポートされているファイルが読み込まれていくので、アプリケーションの肝となるファイルです。

main.go
package main

import (
    "github.cogom/gin-gonic/gin"
)

func main() {
    router := gin.Default()
    router.LoadHTMLGlob("templates/*.html")

    router.GET("/", func(ctx *gin.Context){
        ctx.HTML(200, "index.html", gin.H{})
    })

    router.Run()
}

ここではginを使って、ルーティングを設定しています。/にアクセスが来たらindex.htmlを表示するといった具合に設定をしています。

そしてそのindex.htmlがなくては表示させるファイルがないのでindex.htmlを作成します!

templatesディレクトリーを作ってその下にindex.htmlを作成します

templates/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Sample App</title>
</head>
<body>
    <h1>Hello World!!!</h1>
</body>
</html>

これでお待ちかねのHello Worldの準備が完了です!

go run main.go

これを実行して localhost:8080 にいくと。。。!?!?

image.png

ででーーーーーん!!
Hell World!

何回みてもこの感動は良いですよねえ。

Docker化

ここではDockerの説明は省きますが、Dockerにしておくと環境の違いで苦しんだりすることがないのでDocker化しておきます。

touch Dockerfile

Dockerfile を作成します。

FROM golang:latest
RUN mkdir /go/src/app
WORKDIR /go/src/app
ADD . /go/src/app
VOLUME /go/src/app
RUN go mod download
EXPOSE 8080
CMD "go" "run" "main.go"

途中の go mod download でさっき作成した go.mod から自動でライブラリーを読み込んでくれると!便利ですね。
あとは今までやってきたことをDockerにやってもらっているだけです!

では実行していきましょう!

docker build -t perfect_todo .
docker run -it -p 8080:8080 perfect_todo

これでさっき実行した時と同じ挙動になったら成功です!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む