Go関連のことを調べてみた2020年11月02日

Go関連のことを調べてみた2020年11月02日

【Goデビュー】GoでCRUDアプリをClean Architecture、Mysql、GORM、Echoで作る

#はじめに

本記事では `Clean Architecture` で、
DBは `Mysql` 、フレームワークは `Echo` 、ORMapperには `GORM` を用いて
`CR(U)D機能を持つAPI` 作っていきます。

### 作るもの

Create、Read、(Update)、Delete機能を持つAPI
Updateだけ未実装ですので、ぜひご自身で追加してみてください!

### 対象読者

Goの環境構築まで終えて、簡単なAPIを作ってみたい人

### 使用技術

|技術 |種類 |
|—|—|
|DB |Mysql |
|ORM |GORM |
|フレームワーク |Echo |

# 目次

# Clean Architectureとは

Clean Architectureというと、以下の図が大変有名です。

![clean.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633802/b785a780-20e9-96ae-52ae-597a7

元記事を表示

AtCoder Beginner Contest 181のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/abc181

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var n int
fmt.Scanf(“%d”, &n)

if n % 2 == 0{
fmt.Printf(“White”)
}else{
fmt.Printf(“Black”)
}

}
“`

# B
“`Q_B.go
package main

import (
“fmt”
)

func main() {
var n int
fmt.Scanf(“%d”, &n)

var a, b int64
var result int64
for i := 0; i < n; i++ { fmt.Scanf("%d %d", &a, &b) result +

元記事を表示

Goで双方向リストをJSONに変換する際のつまずき

# 何があったか
Goでコーディング中、双方向リストっぽいものを自作&JSONに変換する必要性があった。方針としては `encoding/json` を使っていくつもりが、ごちゃごちゃ詰まってしまった、という話。

# 要するに
* structに自分自身がいるときはちゃんとポインタにしましょう
* JSONに変換するとき、そいつが循環する可能性があるなら、`json:”-“` で無視させて、阻止しておこうね

# structに自分自身がいると invalid recursive type

当たり前っちゃ当たり前の話ですが。

## 失敗編

“`golang
package main

import (
“encoding/json”
“fmt”
“log”
)

type Person struct {
Name string
Parent Person
Child Person
}

func main() {
sora := Person{}
sora.Name = “Sora Amamiya”
j, err := json.Marshal(sor

元記事を表示

GORM バージョン2の変更点

# 前書

2020年8月、GORMのv2.0がリリースされました。
変更点が多くて、一部の関数でv1と互換性がないため、この記事で取り上げてみたいと思います。
[change log link](https://gorm.io/docs/changelog.html)

“`
Change Log
v2.0 – 2020.08
GORM 2.0はゼロから書き直されたもので、互換性のないAPIの変更と多くの改善が導入されています

– パフォーマンスの改善
– モジュール性の向上
– Context, Batch Insert, Prepared Statment Mode, DryRun Mode, Join Preload, Find To Map, Create From Map, FindInBatches サポートします。
– SavePoint/RollbackTo/Nested Transaction サポートします。
– 名前付き引数、グループ条件、アップサート、ロック、オプティマイザー/インデックス/コメントヒントのサポート、サブクエリの改善
– 完全な自己参照

元記事を表示

関数について

##関数の基本構文
関数定義の基本形は下記のようになります。

“`
func 関数名(引数) 戻り値型 {
処理の内容…
}
“`

関数に対して引数を取り、関数の戻り値を指定して、処理内容を書いていく流れです。

##名前付き関数
では、簡単な関数を定義してみます。

“`main.go
func test(x, y int) int {
a := x * y
return a
}

func main() {
fmt.Println(test(10, 5)) //50
}
“`

関数testをint型のx, yで定義し、戻り値型にint型を指定しています。変数aに処理を代入し、returnした値をmain関数で受け取り、値を指定して出力しています。

また、戻り値は複数返すことができます。

“`main.go
func test(x, y int) (int, int) {
a := x * y
b := x / y
return a, b
}

func main() {
a, b := test(10, 5)

元記事を表示

Go言語の特徴満点なHello world

以前ツイートしていたGo言語の特徴満点なHello worldを、Qiita記事とて残しておきます。

“Hello #番号 world” を0〜99番、goroutineで並列処理して表示させる、というシンプルな目標を実装しているだけです。しかし、意外とGo言語の中枢に踏み込むコードが必要で、面白いです。

チャネルを使わないと途中で終わっちゃいますし、ちゃんとgoroutineに引数を渡してあげないと番号が重なってしまいます。実はツイートした時はこれらの対応をしておらず、今回記事化するために真面目に実行してみて、途中で終わっているとか変なことに気付きました。笑

ソース

“`Go
package main

import “fmt”

func main() {
max := 100
quit := make(chan bool, max)
for i := 0; i < max; i++ { go func(j int) { fmt.Printf("hello, #%v world\n", j) quit <- true }(i)

元記事を表示

GO公式のチュートリアル メモ 1

## 目的
– GO言語のキャッチアップのためメモ書き
– 公式が英語なので、日本語化+注釈も入れながら進める(翻訳はDeepl)

## はじめに
参考にしているサイトは[GO公式](https://golang.org)に記載されている[Wiki Tutorial](https://golang.org/doc/articles/wiki/)です。
本記事では上記URLの`Getting Started`, `Data Structures`まで扱います
チュートリアルやらずにこのページをざっと見る程度でもいいと思います

## 内容
まずはディレクトリを作成

“`
$ mkdir gowiki
$ cd gowiki
“`

>wiki.goという名前のファイルを作成し、お気に入りのエディタで開き、以下の行を追加してください。

“`wiki.go
package main

import (
“fmt”
“io/ioutil”
)
“`

– fmt…[リファレンス](http://golang.jp/pkg/fmt) フォーマットI/Oを実装するために必要な

元記事を表示

go-json-restモジュールを使って簡単にAPIサーバを作る

## リポジトリ
https://github.com/ant0ine/go-json-rest

## Hello worldを表示するプログラム

“`main.go
package main

import (
“github.com/ant0ine/go-json-rest/rest”
“log”
“net/http”
)

func main() {
api := rest.NewApi()
api.Use(rest.DefaultDevStack…)
api.SetApp(rest.AppSimple(func(w rest.ResponseWriter, r *rest.Request) {
w.WriteJson(map[string]string{“Body”: “Hello World!”})
}))
log.Fatal(http.ListenAndServe(“:8080”, api.MakeHand

元記事を表示

ローカル(ソース非公開)プロジェクトでGo言語の推奨ディレクトリ構成(golang-standards/project-layout)を使う

#### go version go1.15.2

[Go言語コミュニティの推奨ディレクトリ構成](https://github.com/golang-standards/project-layout)に従い、標準のパッケージ管理システムである「[Go Modules](https://github.com/golang/go/wiki/Modules)」を使おうとして微妙にハマった。
自サイトに同じ記事をメモとして書いたが、ツッコミが欲しくなったのてQiitaにも投下しておく。

## ディレクトリ構成例

エクスクラメーションマーク(!)が付いている名前(及び下位要素)は、任意の識別子です。

“`shell
my_project(!)
├── web # Webシステムで使うシステム外リソース。jsとか画像とか
├── assets # Webシステム以外で使うシステム外リソース。
├── cmd # mainモジュールを格納
│ ├── mainexe(!) # プロジェクト中の実行ファイル。この単位でbuild
│ │ └── main.go
│ └── c

元記事を表示

【Golang】テスト実行時に “package exec is not in GOROOT”

> Go 言語(Golang)の `testing` を使ってテストを実行すると「`exec` パッケージがない」と言われます。

“`shell-session
$ go test .
# github.com/KEINOS/Hello-World
main_test.go:5:2: package exec is not in GOROOT (/usr/local/go/src/exec)
FAIL github.com/KEINOS/Hello-World [setup failed]
FAIL
“`

意外なことに[「”golang” package exec is not in GOROOT」とググって](https://www.google.com/search?q=%22golang%22+package+exec+is+not+in+GOROOT)も、当然すぎるのか、すぐに見つからなかったので自分のググラビリティとして。

– go version go1.15.3

## TL; DR

> `exec` は `os` パッケージの一部です。`exec` →

元記事を表示

[Go] echoフレームワークで Response Body (レスポンス ボディ) を取得するアレな方法

## まえがき

上司たそ「@syamamura くん。エラーログ出して欲しいんだけど、トレースログとエラーコード。ロギングしといて。よろしく」
ぼく「はぁい」

エラーコードは??**紆余曲折**??の末、決定される仕様なため✨?**綺麗**?✨に取得するには**レスポンス**から取るしかないことに気づく。

エラー時のみハンドリングしたかったとか、ログにトレースログを含める必要があったとか、そんな理由で実装した。
**困った人**向け。

文字通りアレな方法だと思うので、単純に Response Body を取得したいだけの**困ってない人**は[middleware/body-dump](https://echo.labstack.com/middleware/body-dump)を使ったほうが良いと思う。

## 困った人。

Response Body を取得したいけど Response は stream 的なものに書き込まれてるっぽくって後から取得しようとしてもできなかった。
なので `Context.Response().Writer` をトラップ付き Writer

元記事を表示

gRPCとFirebase Authenticationで認証処理

# はじめに
gRPCとFirebase Authenticationを使用したGoサーバでの認証処理のやり方を紹介します。認可処理についてはまた別記事で書く予定です。

# Firebase Authentication
SDKの追加は以下のコマンドからできます。

“`shell
go get firebase.google.com/go
“`

Firebase Admin SDK for Go の初期化は以下を参考にします。
[サーバーに Firebase Admin SDK を追加する](https://firebase.google.com/docs/admin/setup?hl=ja#initialize_the_sdk)

従来は“`option.WithCredentialsFile()“`を使用した初期化が一般的だったようですが、GOOGLE_APPLICATION_CREDENTIALS 環境変数を使用する初期化を強くお勧めしているようです。

“`go:firebase.go
package middleware

import (
“context

元記事を表示

converting argument $1 type: unsupported type []string, a slice of stringに悩まされた話

#概要
エンジニア1年目の初投稿です。
sqlxを使ってDB操作をしていたら、下記のエラーに悩まされたので記録します。
コメント、ダメ出しなど頂けると嬉しいです。

“`
converting argument $1 type: unsupported type []string, a slice of string
“`

# シナリオ

SELECT文のWHERE句にIN条件を使った操作を行おうとしていたところ、エラーに嵌まりました。
今回は,以下のUSERテーブルからgoとpythonを使えるUSERを抽出する操作を書いていきます。

| Name | Skill |
| — | — |
|Ichiro| C |
| Jiro | C# |
|Saburo| Java |
|Shiro | python|
|Goro | go|
|Rokuro| Ruby|
|Shichiro|go|

## 各種ツール

– go 1.14
– github.com/jmoiron/sqlx v1.2.0
– github.com/go-sql-driver/mysql v1

元記事を表示

Go Moduleでローカルで作成したパッケージを読み込む

Goを勉強し始めました。
本を使って勉強しているのですが、基本的にバージョンが古いです。
ですので、Go Moduleを使ったファイル構成になっていないのがほとんど。

しかし、今後のバージョンアップでModuleを使う動きになっていく流れになっていくそうです。
ですので、初心者でもModuleを使って開発がしたいと思いまして、イジイジしてたのですが、思ったよりも苦戦しました…

特にローカルで作ったパッケージを、他のファイルにimportする方法がわからず苦戦。
同じエラーで苦しむ人を減らすべく、記事を書こうと思いました。

## Go Moduleとは
パッケージ管理ツールです。
Go 1.11以前では`$GOPATH/src/`配下にソースコードを置かないとローカルで作ったパッケージなどをうまく扱えなかったのですが、`go module`を使えばどこのディレクトリからでも、パッケージ管理ができるようになったらしいです。
nodeのpackage.jsonみたいなものですかね。
なので、環境変数のパスに依存せずにプロジェクトを作ることが可能です。

## 導入
Version

元記事を表示

grpc-nodeでエラー時にerrdetailsを返却する

# grpc-nodeでエラー時にerrdetailsを返却する
gprcのバックエンドとしてnodeを選択するとフレームワークとして公式のgrpc-nodeが選択に上がると思います
https://github.com/grpc/grpc-node

正常系はそつなく実装できるのですが、エラー時にGoなどで言うところのerrdetailsを利用したくなったときに苦労したのでその覚書
(正確にはerrdetailsと呼ぶのかは分かりませんがGoのパッケージ名がerrdetailsなのでそう呼んでます)

## errdetailsって何?
gRPCのフレームワークが用意しているエラーの詳細を記述できるメッセージオブジェクトです
例えば、REST-APIを設計するときなどにjsonのエラーオブジェクトも設計する必要があると思うのですが、
統一的なフォーマットがなく(一応RFC7807という規格はあるが従っていることが少ない)、設計時に揉めるであろうことが予測されます

そこで、gRPCが用意しているメッセージオブジェクトと仕組みを利用することで、設計時に疲弊しなくて済みます

下の実装例

元記事を表示

Dockerを使用してgo環境を構築

今回は最近勉強しているDockerを使用してgo環境の構築を行いました。

1.Dockerfileを作成
“`FROM golang:latest
RUN mkdir /go/src/charts_server && apt-get update && apt-get install \
  -y vim
WORKDIR /go/src/charts_server
ADD . /go/src/charts_server
“`

・FROM golang:latest
  golangの最新版をベースにします。

・RUN mkdir /go/src/charts_server && apt-get update && apt-get install \ -y vim
  mkdirで作業場所の作成。エディタもインストールします。

・WORKDIR /go/src/charts_server
   Docker instructionの実行ディレクトリを/go/src/charts_serverへ変更。

・ADD . /go/src/charts_s

元記事を表示

Mac上でPythonかGolangでGUI開発環境を整えたい

またまた無職になった。
ニート期間中に技術力を上げるため、就職活動しながら勉強することにした。

# スクリプト言語の勉強
一昔前はPerl言語に熱中していたが、数年間離れた生活をしていた。
不倫したと思われたのか、一目Perl言語を見ただけでは理解できない感じにふてくされた態度を取られた。
構ってあげなかった私に問題があるのかもしれないが、このまま分かれようと思う。
一体いくらつぎ込んだのか分からないぐらい膨大な書籍代だが、私の一方的な貢ぎ方に問題があったと思って諦めることにする。
心機一転し、異なるスクリプト言語に本腰を入れようと思う。
しかし、まだ本命を決められないでいる。

## 本命選び
今の考えは2点ある。

* Python
* Golang

テキスト処理をしたいが、それはPerl言語をさておき、上記2点は優劣付けがたいようだ。
ちょっと触った感じでは、Go言語の方が馴染みやすかった。
如何せん、ちょっとした処理とは言え、数週間や数ヶ月後には使い方を忘れているかもしれない。
それでもテキスト

元記事を表示

GolangでJSONを受け取るAPIサーバーのサンプル

## サンプルコード

“`main.go
package main

import (
“encoding/json”
“fmt”
“net/http”
)

// 構造を宣言
type User struct {
Name string `json:”name”`
Age int `json:”age”`
}

func main() {
// POST
http.HandleFunc(“/post”, func(w http.ResponseWriter, r *http.Request) {
var user User
json.NewDecoder(r.Body).Decode(&user)

fmt.Fprintf(w, “%s is %d years old!”, user.Name, user.Age)
})

// GET
http.HandleFunc(“/get”, func(w http.ResponseWriter, r *ht

元記事を表示

Go初心者がDatastore・GAEを使用したクラウドネイティブなWebアプリを作成してみた

#はじめに
Qiita初投稿です。
IT業界に未経験で転職して半年が経ったので、これまでのGo言語学習の成果をアウトプットする為にWEBアプリを作成してみました。
今記事ではこのWEBアプリを紹介していきます。
(初学者ですので、誤っている点などがありましたら、是非コメントでご指摘ください:bow_tone1:)

##簡易4択問題集作成・学習アプリ
###1 デモ

– **WEBアプリurl**
https://workbook-292312.an.r.appspot.com/

– **WEBアプリのリポジトリ**
https://github.com/Gompei/WorkBookApp

###2 機能紹介・実装内容
####(1)アカウント機能
– **作成**
formから取得したアカウント情報を元に、Datastore内で発行した

元記事を表示

Control files to build in Golang project

# Background

We are developing a project that needs to run on Windows and Linux. The project is written in Golang. There are a lot of codes that can be shared between these OS, so we decided to make it in the same project. By this way we can speed up the development process very much.

In the project, there are some code files that run on Windows only, some run on Linux only, and some run on both Windows and Linux. And we want to separating them on build. It means:

– The binary for Linux will

元記事を表示

OTHERカテゴリの最新記事