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

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

【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
“`

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

元記事を表示

gRPC-WebをGoとTypeScriptで実装してみた

## はじめに
最近話題?のgRPC(gRPC-Web)を、フロントエンドはTypeScript、バックエンドはGoで実装してみました。

今回試した内容は、画面でボタンをクリックすると、gRPCでバックエンド処理を呼び出し、戻り値を画面表示するというシンプルなものです。

なお、説明で使用しているサンプルコードは、簡単に試せるよう以下にも上げてあります。
https://github.com/kahia1114/grpc-web-sample

## 前提条件
– 以下で説明するサンプルコードは、Macで動作確認しています。

– 端末に以下のパッケージがインストール済みであることを前提としています。

– Node.js v12.4.0
– protobuf 3.12.4
– protoc-gen-grpc-web
– protoc-gen-go
– Go 1.15

※MacにHomeBrew導入済みであれば、`brew install node protobuf protoc-gen-grpc-web protoc-gen-go go`でインストールでき

元記事を表示

GolangでDynamoDBにListデータを登録する方法

Golangを使ってDynamoDBにListデータを登録する方法を調べた際のメモ。

## 方法
DynamoDBの開発者ガイド([Update Expressions](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.SET.AddingListsAndMaps))には以下の感じに指定するといけると記載れている。
`L` は `List`の略らしい。

“`
“:hobbies”: {
“L”: [
{ “S”: “家庭菜園” },
{ “S”: “サイクリング” }
]
}
“`

これをGolangで書くと以下のような感じになる。

“`golang
type User struct {
userId string
hobbies []string
}

func appendParams(user

元記事を表示

AWS AppSync(GraphQL)のバックエンドにAWS Lambda(serverless framework) x Golangを使ってみる

AppSync(GraphQL)でバックエンド側でこちょこちょ計算する必要のある機能が必要になり、Lambda(serverless framework)をGolangで書いてみたのでメモ

*serverless frameworkを使うので、前提として[serverless AWS – Credentials](https://www.serverless.com/framework/docs/providers/aws/guide/credentials/)の設定をしている必要がある。

## 導入
Lambdaは[serverless framework](https://www.serverless.com/)を使って管理したいので、以下の手順でGolangのLambdaの雛形を作る。

*`serverless`コマンドは`sls`と省略できる

“`bash
# serverlessフレームワークをインストール
$ npm install serverless -g

# テンプレートを使ってLambdaの雛形を作る
$ serverless create -u htt

元記事を表示

【Golang】Go言語の基礎 結局ポインタって何なの??

Go言語やC言語を学ぶ上で避けては通れないのがポインタです。
プログラミング初学者の入門言語であるRubyやPHPにはポインタという概念がありません。
Rubyから入った僕にはいろんな記事を読んでも???でした!そんな方にもわかるようにここでは解説いたします!

#ポインタとは?
プログラムというのは、メモリの中で読み込まれ、CPUで処理されます。また、僕たちが普段プログラムで使っている変数というのはメモリの中に配置されます。CPUによってメモリの中に配置されている変数の値を処理しているのです。
**ポインタというのは、変数がメモリのどこに配置されているか?という情報(変数の住所)を格納する変数のことです。**

##早速コードを書いてみる
“`go

package main

import “fmt”

func main() {
var n int = 10
fmt.Println(n) // => 10

//アンパサンドを付けることで変数を入れたメモリの住所(正式にはアドレスといいます。)が表示できる。
fmt.Println(&n) // => 0xc000

元記事を表示

JWE(JSON Web Encryption)は2020年現在も危険なのか?

## 概要

* [JOSEは、絶対に避けるべき悪い標準規格である | POSTD](https://postd.cc/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid/)
* [JSON Web Encryption (JWE) の解説 – Qiita](https://qiita.com/ono_matope/items/938a98fb111a297b68b9)

いくつかの記事でJWEは避けるべき、脆弱性がある。という指摘があるが、これらが議論されていたのは2017年頃だ。2020年においてまだ該当記事の脆弱性が実際に存在するか調査した結果を記録する。私はJWEのエキスパートではないし、RFC-7516を全て読み込んでもいないため間違っている部分があるかもしれない。もしこの調査結果に対してフィードバックがあれば編集リクエストを送ってほしい。

## 結論

現在は脆弱性は修正され、安全なようだ。脆弱性に対応していないライブラリを使っている場合はもちろん危険なので使用しているライブラリが対応されているか調

元記事を表示

Goで画像の形式を変換するCLIツールを作った

# はじめに
Goで画像の形式変換をするCLIツールを作りました。

– **jpg (jpeg)**
– **png**
– **gif**

の間で相互に変換可能です。

ソースコードはこちら↓

# 機能

| オプション | 説明 | デフォルト |
| —- | —- | — |
| -f | 変換前の画像の拡張子 | .jpeg |
| -t | 変換後の画像の拡張子 | .png |
| -r | 変換前の画像を削除する | false |

## 使い方

オプションに何も指定しなかった場合は、.jpeg → .png への変換になります。

“`
$ ./imgconv sample.jpeg
“`

.png → .j

元記事を表示

ゴゴコ゛ゴゴゴコ゛をゴゴゴゴゴゴゴにするGo言語のライブラリを作ってみた

# はじめに

Unicode 正規化って日本語の処理に向いていないというか、ちょっと使いどころが難しいと思いませんか?

ということで、Golang のノーマライゼーション・ライブラリを作ってみました。使えるレベルに仕上がったと思うので **GaGa** という名前で公開します。

Unicode 正規化に関しては、既に Golang の準標準ライブラリに、

* golang.org/x/text/unicode/norm
* golang.org/x/text/width

というパッケージがありますが、今回作ったものと機能を比較すると以下のような違いがあります。

|機能など|gaga|norm|width|補足|
|:-:|:-:|:-:|:-:|:–|
|全角-半角
変換|〇|△|△|詳細は後述しますが、norm と width は期待外れな結果を返します。|
|ひらがな-
カタカナ
変換|〇|×|×|「ひらがな-カタカナ変換器」はノーマライザというよりはトランスレータの類かもしれませんね。|
|大文字-
小文字
変換|〇|×|×|これは G

元記事を表示

Golandでdelve古くてデバッガ動かねえよって叱られた時の対処

うっすい内容ですがvscodeの情報は結構あったけどGolandのは発見出来なかったので一応

タイトル通り、GolandでDebug実行しようとすると

“`
Version of Delve is too old for this version of Go …
“`
こんなんが出て叱られるときの対処です。
Golandはこの記事書いた時点で1番新しいです

単純に[go-delve](https://github.com/go-delve/delve)自前でビルドしてプラグイン差し替えれば良いです。
mainは`cmd/dlv/`配下にあるので、`git clone`かましたらディレクトリ移動して`go build`
念のためもともとあったdlvバイナリは`dlv.bk`とかにしておき、
できあがったバイナリを`[[your path]]/[[Goland本体ディレクトリ]]/plugins/go/lib/dlv/linux/`下に放り込めばok

元記事を表示

書籍「Go言語でつくるインタプリタ」の進行で躓いたところ

# はじめに
書籍「Go言語でつくるインタプリタ」を進めていたところ、序盤(1.3節)から躓いたので解決方法をメモしておこうと思います。
なお、go言語の開発で本来とるべき構成などとは異なっている可能性がありますが、あくまでこの書籍をすすめるための対処となりますのでご了承ください。

# 1章3節でビルド結果が違う
1.3節をすすめていると、テストコードのビルドの際に紙面では「New関数が定義されていないのでエラーが発生する」、という段取りのはずが

“`cmd:想定
# monkey/lexer [monkey/lexer.test]
lexer\lexer_test.go:28:7: undefined: New
FAIL monkey/lexer [build failed]
FAIL
“`
テストコードの中で指定している「パッケージ”monkey/token”が見つからない」と出たところで異常に気づきました。

“`cmd:実際
lexer\lexer_test.go:6:2: cannot find package “monkey/token” in any of

元記事を表示

【Golang】コレクションを導入したら幸せになったので、わかりやすく説明してみる

# はじめに
こんにちは。むらってぃーです。
チームで開発しているプロダクトのコードがそれなりに大きくなってきました。

メソッドによっては「割と冗長になってきたね」という話が出てきました。
その部分のほとんどが配列操作の部分だったので、コレクションを使ってリファクタリングを行ったのがこの記事のきっかけです。

エンティティのスライス操作のロジックをコレクションに閉じ込めると、可読性が上がったりテストしやすくなったりで幸せになれたので紹介します。

# 実装例を交えて紹介
今回は、bookというエンティティと、それを扱うリポジトリ、サービスをコンポーネントとして扱います。

## 今回扱うコンポーネント
### エンティティ
bookというエンティティはID、タイトル、著者の3つの値を持ちます。

“`book.go
package entity

type Book struct {
ID uint64
Title string
Author string
}

func NewBook(id uint64, title, author string) *Book {
re

元記事を表示

Emacs で Go の開発パッケージを入れられない Not found, Failed to verify signature の解決方法 (Ubuntu 18.04)

タイトルが長い。

emacsで package-install が上手くできなかった方向けです。
以下の参考のブログの、「必要な go パッケージの導入」まで行っている事が前提です。

# 参考
https://qiita.com/bussorenre/items/3e80e59d517db8aebf46

# Emacs のバージョン確認
“`
emacs –version
“`
バージョンが26以上の方は次の作業をする必要はありません。

25以下の方はバージョンアップする必要があります。
(解る方は、鍵を取得して更新する方法もあります)

# Emacs のバージョンアップ
Emacs の package-install ではバージョンが古いと署名鍵が一致しない場合があるようです。
この場合、パッケージを管理しているレポジトリに接続できません。

新しいバージョンのEmacsを使うことでこの問題を解決できます。

“`
sudo add-apt-repository ppa:kelleyk/emacs
sudo apt update
sudo apt install e

元記事を表示

Goで実装する並列処理(Hello, world!を10000回出力してみる)

`”Hello, world!”` が100行書き込まれた `write1.txt` ~ `write100.txt` という名前の100個のテキストファイルを作成する場合、並列の有無で実行時間が変わるのか調べました。

> Goのバージョン: **go1.15.2 windows/amd64**
> PCの環境: Windows 10 Pro / Intel(R) Core(TM) i5-6300U CPU @2.40GHz (コア数:2, プロセッサ数:4)
> プログラムはテキストエディタAtom上で動かしており、下記のコードからは時間計測用の部分を除いています。下記の実行時間はコンパイルの時間を含みません。

#・並列せずに実行する

“`Go
package main
import (“os”; “strconv”)

func writeByres(num int) error {
filename := “write” + strconv.Itoa(num) + “.txt”
file, err := os.Create(filename)

元記事を表示

OTHERカテゴリの最新記事