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

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

Open API 3.0の定義からgolangのサーバコードのスケルトンを作成する

# Open API 3.0の定義からgolangのサーバコードのスケルトンを作成する

## TL; DR

1. API定義をSwagger Editorで作成する(Open API 3.0)
2. API定義からGolangのサーバコードのスケルトンを作成する
3. コードを実装し展開する

## 注意

初心者のメモです。まだ途中までしか作成してません

## API定義をSwagger Editorで作成する(Open API 3.0)

みんなSwaggerなるものを使っている。
仕様ドキュメントと実装が違うなどということはソフトウェア開発ではたびたび経験しているから、ぜひとも避けたい。

聞くに、`Swagger Editor` というヴィジュアライズしてくれる便利なものもあるらしく、これは便利である
作成した定義は、`[File]` > `[Save as YAML]` で ダウンロードできる。

![Swagger Editor](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333

元記事を表示

go/mysqlで値が上手く取れない

go/gorm/mysql
で値が上手く取れない現象が起きたので備忘録がてら例えばこのようなテーブルを作成し、

“`sql
CREATE TABLE dataids (
id INT,
titleid INT,
titleid2 INT
);

“`

以下のように、insertしときます。

“`sql
INSERT INTO collectq_db.dataids (id, titleid, titleid2) VALUES
(1,1,1),(2,1,2),(3,1,3);
“`

そしてgormで取得しようと以下のようにしました

“`go
type Dataid struct {
id int
titleid int
titleid2 int
}

func GetAllDataids(db *gorm.DB) []Dataid {
var dataids []Dataid
db.Find(&dataids)
fmt.Println(“確認!!”, dataids)
return dataids
“`

とす

元記事を表示

Go言語のコンパイラ、インタプリタ利用時にもTABキーで補完したいという願望を叶える方法

Go言語のコンパイラ、インタプリタ実行時にコマンドがTAB補完出来ず不便な思いをしていました。探したところ、`gocomplete`と言う拡張機能をインストールするとbash completionの様にTAB補完出来ることが分かりました。故に、利用方法を備忘録メモとして残しておこうと思います。

# 拡張機能の入手

“`bash
$ go get -u github.com/posener/complete/gocomplete
“`

# インストール

“`bash
$ $GOPATH/gocomplete -install
Install completion for go? y
Installing…
Done!
“`

上記のインストールコマンドの実行により、.bash_profileにgocompleteを有効化するための情報が書き込まれます。

“`bash:.bash_profileに書き込まれる情報
complete -C /Users/yuhkiyano/go/bin/gocomplete go
“`

# 有効化
シェルを再起動するか、以下の様に

元記事を表示

組み合わせ爆発ハラスメントの処方箋

プログラミング初学者向けの内容です。
今のところ Golang, Ruby, Python, JavaScript, TypeScript による処方箋のみ掲載しています。

# ある日のこと

知人「店長からさぁ、

   『うちはメニューの数が少ないから、
    コンビ・メニュー作ることにした』

   『とりあえず、
    今あるメニューを組み合わせて、
    単品から全部入りまで
    すべての組み合わせのリスト作ってくれ!』

   って、言われたんだけど…」

俺「え? それって、
  ???があるとしたら、
  ↓みたいなやつ?」

1:?
2:?
3:? ?
4:?
5:? ?
6:? ?
7:? ? ?

知人「そう。そう。それ!それ!」

俺「作れるけど、、
  きっとものすごい数になるよ。
  単品メニューって何種類くらいあんの?」

知人「20種類くらいかなぁ。。
   物好きな店長でしょ?!
   めんどくせぇ。。」

俺「…」

俺「あのさぁ、、
  面倒くさいとかの次元じゃないんだけど。。」

俺「0.1 mm 厚の紙を 26 回折っ

元記事を表示

golang 共通のテンプレート利用

#golangで共通テンプレートを利用する方法

下記のようなHTML共通部分は別のテンプレートにしたい

“`header.html




maincontents



“`

ヘッダーテンプレート、フッターテンプレート、メイン部テンプレートを分割

“`header.html
{{define “header”}}




{{end}}
“`

“`footer.html
{{define “footer”}}


{{end}}
“`

`{{define “header”}}`・・・でテンプレートをDefineする

“`main.html
{{template “header” .}}

maincontents

{{templat

元記事を表示

golang バリデート(validator.v9)

golang バリデート

[gopkg.in/go-playground/validator.v9](https://github.com/go-playground/validator)

バリデーションライブラリ利用してバリデート

###パッケージを取得

“`
>go get gopkg.in/go-playground/validator.v9
“`

####利用ソースファイルでパッケージのimport

“`golang:main.go

import “gopkg.in/go-playground/validator.v9”

//
type DataUser struct {
LoginID string `validate:”required,email”`
Password string `validate:”required”`
}

“`

| Tag | 説明 | 利用 |
|:———–|:————|:————|
| required | 必須 | — |
|

元記事を表示

AWSクレデンシャル情報取得のベストプラクティス(AWS SDK for Go)

# はじめに
ECS(Fargate)でAWS SDK for Goを使ってAWSサービスを操作した際に、最初は勢いで作ったものの本当にこれでいいんだっけ?とモヤモヤしたことがあったので、クレデンシャル情報取得の優先順位とベストプラクティスについてまとめます。

# 結論
いきなりですが、下記がベストプラクティスとされる優先順位です。
詳細について後述します。

“`
1. ECSでアプリを実行している場合、タスクロール
2. EC2でアプリを実行している場合、EC2のIAMロール
3. 認証情報ファイル
4. 環境変数
“`

# Sessionの生成
まず、AWSサービスを使うためのsessionを生成します。
今回はリージョンのみ指定しています。

“`
sess, err := session.NewSession(&aws.Config{
Region: aws.String(“ap-northeast-1”)},
)
“`

# クレデンシャル情報取得の優先順位
上記のようにクレデンシャル情報の指定がない場合、以下の優先順位で認証情報を取得します。

“`

元記事を表示

Go学習 自分用メモ

##はじめに
本記事はProgate Go学習コースでの内容を箇条書きしていたものを記事化したものとなります。
ここ違うよ、とか間違ってるよ、などありましたらお気軽に編集リクエストください、泣いて喜びます。

***

###変数の宣言
– varを使う
– var 変数名 intとかstringとか = 値
– :=で宣言可能
– :=で宣言した場合、型の違う値は入らない
– しっかり=を使って値を入れよう

###条件分岐
ifを使う
if, if else, elseを使う、Railsみたいにelsと省略しないように

“`Go
if hoge >= 値 {
println(“結果1”)
} if else hoge == 値 {
println(“結果2”)
} else {
println(“結果3”)
}
“`

###数値の扱い
%%、||は基本
比較は==、反転で!=
不等式の扱いも基本通り

###switch
お馴染みswitch文
caseの値に一致するものを返す
default常備

“`Go
switch 値{
cas

元記事を表示

golangのユニットテストにおけるprivateとpublic

春の終わりからgolang修行中の身。
趣味以外ではproductionのgolangコードをまだいじったことのない、ひよっこの考察を残してみる。

## golangにおけるprivate / publicの理解
関数名や変数名・定数名の先頭を大文字にすることで別packageから参照可能になるいわゆるpublicな状態が `exported`、
反対に先頭を小文字にして同一package内のみ参照が可能になるいわゆるprivateな状態が `unexported` と理解している。

参考:https://tour.golang.org/basics/3

## testpackageとの出会い

書きかけのアプリケーションに、Linter(golangci-lint)をいれたところ、以下のような指摘に遭遇。

“`shell
$ golangci-lint run ./…
/usecase/hoge_test.go:1:9: package should be `usecase_test` instead of `usecase` (testpackage)
packag

元記事を表示

【Golang】Go言語基礎 構造体について②(埋め込み)

今回は[【Golang】Go言語の基礎 構造体について①](https://qiita.com/Kiyo_Karl2/items/95b718449a6b5940c33a)の続編です。

Goにはクラスという概念がありません。したがって継承という概念もないです。しかし、その代わりに構造体の埋め込み(Embedded)というものがあります。

##早速書いてみる

“`go

package main

import “fmt”

type Vertex struct {
//小文字だと他のパッケージからはアクセスできなくなる。
x, y int
}

func (v Vertex) Area() int {
return v.x * v.y
}

func (v *Vertex) Scale(i int) {
v.x = v.x * i
v.y = v.y * i
}

//構造体VertexをVertex3Dに埋め込む
type Vertex3D struct {
Vertex
z int
}

func (v Vertex3D) Area3D() int {

元記事を表示

TinyGo + `VSCode or Vim (もしくはそれ以外の LSP 対応エディタ)` で gopls 連携する方法

TinyGo 0.15 がリリースされて、 gopls との連携が簡単になりました。
逆に言うと今までは [設定がそれなりに面倒](https://qiita.com/sago35/items/f0b058ed5c32b6446834) でした。

このページでは、 TinyGo 0.15 以降での gopls 連携の方法を `VSCode` および `Vim (もしくはそれ以外の LSP 対応エディタ)` に対して記載します。

注意)
以降、 `wioterminal` というターゲットを例として記載します。
適宜、使いたいターゲットに読み替えてください。

## VSCode

まずは、 `VSCode の Extensions > TinyGo 0.2.0` をインストールします。

![Screenshot from 2020-09-23 21-28-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63649/584cbb02-0d00-288b-2f44-22a2b7e2f9b1.png

元記事を表示

Golangでgotoキャンペーン開催

## GoTo文とは

プログラミング界のヴォルデモート卿。
記述してはいけないあの構文。
かつて、エドガー・ダイクストラは言った。Goto文は危険である。

[Edgar Dijkstra : Go To Statement Considered Harmful](https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf)

50年前以上のことであるが、プログラマなら誰もが聞いたことがあり、
物心ついたときから、Goto文を避けてきたとのではないかと思います。

ですが、比較的新しい(?) Go言語にもGoto文は存在し、標準ライブラリにも使われてますので、
~~Gotoキャンペーンにかこつけて~~、様々な利用例を探っていきたいと思います。

>「構造化プログラミングの観点からgoto文を使うのは望ましくない」ものの「単にgoto文を使わなければ見通しが良くなる」という考えは“Go To Statement Considered Harmful”[4]でも否定されており、goto文の有無のみに固執するのは不毛で

元記事を表示

【GORM】セッションを維持して別処理を呼び出す

共通処理を呼び出してテーブル更新するAPIをGo言語で実装していたときに、共通処理含めてロールバックする方法を作りました。
GORMガイドでは、トランザクションの説明はあるものの、処理をまたいだロールバックについては記載されていないようなので、記事としてまとめてみました。

## 環境

Golang 1.14.4

## 例題

図書館のシステムに、
「利用者が本を借りたとき、利用者の所持数を加算し、書架テーブルの貸出中フラグを1に更新する」処理があったとする。
この処理をコードで表すと以下の通り。

“`go
func bookRent() error {
// リクエスト情報を受け取る。今回は割愛して固定値で指定する。
userID := 1
bookID := 23

// DB接続用の情報を設定する。
DBMS := “mysql”
CONNECT := “root:mysql@tcp(localhost:3306)/testDB”
db, err := gorm.Open(DBMS,CONNECT)

元記事を表示

【Golang】Go言語の基礎 構造体について①

Goにはオブジェクトと呼ばれるものはありません。したがって、クラスという概念が存在しないです。
その代わりに構造体というものがあり、オブジェクト指向のような書き方をすることが可能です。

まずは第一弾として構造体の書き方や初期化の方法などについてみていきます。

②では構造体の埋め込み(オブジェクト指向でいう継承のようなもの。Goには継承はありません。)について書いていこうと思ってます!

#構造体を使ってあれこれ書いてみる
構造体は type と structを用いて書くことができます。

“`go

package main

import “fmt”

type Vertex struct {
X int
Y int //小文字のyにすると外部からアクセスできなくなる
S string
}

func main() {
//構造体の初期化
v := Vertex{X: 1, Y: 2}
fmt.Println(v) // => {1 2}

//構造体のフィールドにアクセス
fmt.Println(v.X, v.Y) // => 1 2

元記事を表示

【Golang】Go言語の配列の基礎

最近Go言語の勉強を初めました!

今回は配列の基礎について復習したので備忘録として簡単にまとめさせていただきます。

##書き方

“`
1. var 変数名 [長さ]データ型
2. var 変数名 [長さ]データ型 = [長さ]データ型{初期値A, 初期値B}
3. 変数名 := […]データ型{初期値A, 初期値B}
“`

“`go

package main

import “fmt”

func main() {
var a [3]int
a[0] = 100
a[1] = 200
a[2] = 300
fmt.Println(a) //=> [100 200 300]

var b [3]int = [3]int{100, 200, 300}
b = append(b, 400) //=> ERROR
fmt.Println(b) //=> [100 200 300]

c := […]int{100, 200, 300}
fmt.Println(c) //=> [100 200 300]
}
“`

配列は長さが決められ

元記事を表示

【初学者向け】Go,LINEBot,AWSLambdaで天気予報のボットを作成!

##概要
初投稿になります。
筆者はJavaをメインで勉強してきて、新しい言語(Go)を学びたい!と思って勉強しました。
その過程で自分が躓いたところや参考にした記事を共有できればと思いました。
他の言語をメインとしてきて、Goを学んでみようかな!と思う人がいて、基礎的な知識を身に着ける参考になれば幸いです。

Goのシステムを作成するにあたって、下記サイトGoの基礎を勉強しました。
[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)

##成果物
![スクリーンショット 2020-09-07 13.20.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591392/91147490-fb66-1720-5d20-09c64579cd0b.png)

今回作成したコードです。
[天気予報ボット](https://github.com/shinyahashimoto/weather_forcast/tree/master)

##背景 (天

元記事を表示

Goでinterface引数の型がポインタのときに、ポインタの先が示す型を判別する

`reflect.ValueOf`, `reflect.Value.Elem` を組み合わせるとできる。
(この方法はユーザー定義の型ではなく、言語がデフォルトで用意する型を判別するもの)

“`go
package main

import (
“fmt”
“reflect”
)

func check(i interface{}) {
// interfaceのValueインスタンスを取得
v1 := reflect.ValueOf(i)

// ポインタの場合、さらにその先にある型を取得する処理に進む
if v1.Kind() == reflect.Ptr {
// Elemを利用して、ポインタの先のValueインスタンスを取得
v2 := reflect.ValueOf(v1.Elem())
// Kindを呼ぶと、ポインタの先にある型情報が得られる
fmt.Println(v2.Kind())
}
}

type Foo struct {}

func m

元記事を表示

Go+MySQL+Dockerで簡単なCRUDを実装する

## はじめに
先日、「業務で使う予定ないとはいえGoぐらいある程度知っておいたほうがいいよな…」と思い、Goを使って簡単なCRUDを実装してみたのでそのやり方を備忘録としてまとめておきます。

基本的には以下のサイトの内容を組み合わせて少しアレンジしたものになっています。Goの勉強をする上でこれらのサイトには非常にお世話になったのでこちらもご参考ください。
[DockerでGoの開発環境を構築する](https://qiita.com/uji_/items/8c9eda89526abe0ba900)
[Go / Gin で超簡単なWebアプリを作る](https://qiita.com/hyo_07/items/59c093dda143325b1859)
[Go言語(Golang)入門~MySQL接続編~](https://rightcode.co.jp/blog/information-technology/golang-introduction-mysql-connection)
[docker-compose MySQL8.0 のDBコンテナを作成する](https://q

元記事を表示

Gorm(Golang)で、DBから取得したデータ(複数個)にアソシエーションをつける

現在、個人開発中です。
普段はWEBフロントエンドとしてNuxt.jsとFirebaseくらいしか触らないのですが、個人開発でならもっとモダンな技術をガッツリと使いたいという事で、API開発にGolang + Gorm(ORM)で開発しています。

Gormの公式ドキュメントに載ってある、DBから引っ張ってきたデータへのアソシエーションの組み方は↓こうです。
(参照先: http://gorm.io/ja_JP/docs/has_many.html)

“`
db.Model(&user).Related(&emails)
//// SELECT * FROM emails WHERE user_id = 111; // 111 is user’s primary key
“`
データが1つの時であれば↑これでOKなのですが、
userが複数の時には、下記の通りにする事で各々のユーザーへリレーションが組めます。

“`
db.Where(“user_id = ?”, id).Find(&users)
 for i := range users {
 db.Model(users

元記事を表示

Goで画像をグレースケールにするCLIツールを作った

# はじめに
以前、[Goで画像の形式を変換するCLIツールを作った](https://qiita.com/Le0tk0k/items/ef6121956634b374c3eb) を書いたのですが、
今回はGoで画像をグレースケールにするCLIツールを作りました。

pngとjpgの画像をグレースケースへと変換してくれます。

ソースコードはこちら↓

# 機能

| オプション | 説明 | デフォルト |
| —- | —- | — |
| -r | 変換前の画像を削除 | false |

## 使い方

“`
$ # デフォルト、変換前の画像は削除されない
$ ./main sample.jpeg
“`

“`
$ 変換前の画像を削除する
$ .

元記事を表示

OTHERカテゴリの最新記事