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

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

[Golang]`errors.Is()` `errors.As()` 完全ガイド〜使い方と違いをしっかり調査しました〜

# はじめに

`errors.As()`を雰囲気で使っていたらハマったので、`errors.Is()`も含めて、しっかりと調査してドキュメントとコードを読んだ上でまとめてみました。

ハマったところ、ハマりそうなところを重点的にまとめてみたので、お役に立てれば幸いです。

# 何をするメソッドなのか

## 簡単に

`error`を比較して`bool`を返してくれます。
使いみちとしては、アプリケーションのエラーを外部のエラー(例:gRPCのエラー)に変換したり、ライブラリで使用されているエラーをハンドリングして、アプリケーションのエラーに変換したりするときがあると思います。

### `errors.Is()`
– 比較対象が保持している値と比較します。
– 値が同じなら`true`を返します。
– 値が異なるなら`false`を返します。
– `interface`など比較できない者同士だと必ず`false`になります。

### `errors.As()`
– 比較対象を型レベルで比較します。
– 型が同じなら`true`を返します。
– 型が異なるなら`false`

元記事を表示

Go: panicキャッチ後にStackTraceを表示する

Panicをrecoverした後に、StackTraceを表示したかった
いろんなライブラリをあさって発見したのでメモ

“`golang

package main

import(
“runtime”
“log”
)

func main() {

defer func() {
if err := recover(); err != nil {
stackTrace()
}
}()

panic(“Panic Error!”)
}

func stackTrace() {
stack := make([]byte, 1024*8)
stack = stack[:runtime.Stack(stack, false)]
log.Println(string(stack))
}

“`

元記事を表示

Golangの言語仕様を全部読んでまとめる

https://golang.org/ref/spec の和訳摘要です. 完全性はないです.

Version of Jan 14, 2020

##[ソースコードの表現](https://golang.org/ref/spec#Source_code_representation)
ソースコードはUTF-8である.

###[文字](https://golang.org/ref/spec#Characters)
“`
改行 = LF
unicode文字 = Unicodeの”Letter”
unicode数字 = Unicodeの”Number, decimal digit”
“`

###[文字と数字](https://golang.org/ref/spec#Letters_and_digits)
“`
文字 = unicode文字と”_”
“`

##[字句要素](https://golang.org/ref/spec#Lexical_elements)

###[コメント](https://golang.org/ref/spec#Comments)
“`
プログラム

元記事を表示

米国の日付形式からYYYY-MM-DDに変換する

# 日付形式の変換

文字列として取得した米国の日付形式(`mm/dd/yy`)から `yyyy-mm-dd` に変換したい。

いろんなパッケージやパースがあるみたいなんだけど、ドンピシャのが見つからなかったので↓のようにして対応した。

“`
package main

import (
“fmt”
“strings”
)

func main() {
usDate := “8/9/20”
// => “8/9/20”

slice := strings.Split(usDate, “/”)
// => [8 9 20]

date := fmt.Sprintf(“20%s-%02s-%02s”, slice[2], slice[1], slice[0])
// => “2020-08-09”

fmt.Println(“yyyy-mm-dd:”, date)
// => yyyy-mm-dd: 2020-09-08
}
“`

他にいい方法を知ってたらおしえてください(切実)

# 参考

– https:

元記事を表示

Angular+Golang(gin)でSPAを作る

## 目標
Angularで作成したSPA(シングルページアプリケーション)に対して、GolangのWebフレームワークであるginを使ってHTTPアクセスできるようにします。

## なぜginを使うか。
– ログがわかりやすいから。
– 記事が見当たらなかったから

### 前提

– [「Angularのチュートリアル」](https://angular.io/start)を通していること。

– チュートリアル程度のAngular CLIが使えること。

– 既に、ご自身で作成されたAngularプロジェクトがあることを想定しています。

**ご自身で作成されたAngularプロジェクトがない場合:**
後述する[「プロジェクトをコピー」](#プロジェクトをコピー)の手順を無視して進めてください。
デフォルトで生成されるSPAを表示することができます。

#手順

###プロジェクト作成
始めのプロジェクト構成は以下のようにしています。

“`
go-angular
└── main.go
“`

`go-angular`ディレクトリに移動して、Angula

元記事を表示

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]
}
“`

配列は長さが決められ

元記事を表示

OTHERカテゴリの最新記事