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

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

golang pointer

“`p.go
type Vertex struct {
X, Y int
}

var p *Vertex
p = &Vertex{1, 2}

“`

元記事を表示

GO/Gin gin-swagger使用してAPI仕様書を生成します

# 前書

この記事は `gin-swagger`ライブラリ使用してGinプロダクトにAPI仕様書生成するための知見をまとめるものになります。
[gin-swaggerリポジトリリンク](https://github.com/swaggo/gin-swagger)
![swagger-banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/462bd1f0-1756-44a5-7363-f88e6553281c.png)

# テスト用のプロダクトを作成
フォルダを作成

“`
// 任意のディレクトリで
$ mkdir use_swagger && cd use_swagger
“`
go modを初期化

“`
$ go mod init use_swagger
“`

# ライブラリインストール

“`
$ go get -u github.com/gin-gonic/gin
$ go get -u github.com/swaggo/swag/cmd/swag
$

元記事を表示

【Golang】Go言語の基礎 値レシーバーとポインタレシーバーについて

今回はGo言語の値レシーバーとポインタレシーバーについてやっていきます!
この記事の後に、[こちらの記事](https://qiita.com/Kiyo_Karl2/items/752c3619240a293a7c0a)まで読んでいただくとよりGo言語に関する理解が深まると思います!

#値レシーバーとは
“`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
}

func main() {
v := Vertex{3, 4}
v.Scale(10)
fmt.Println(v.Area()) // => 12
}
“`
こちらは値レシーバになります。
めっちゃ乱暴にいうと*がなければ値レシーバーになります。値渡しとか言われるようです。

v.Scale(10

元記事を表示

ACL Beginner Contest のメモ

# 前置き

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

# 問題

https://atcoder.jp/contests/abl

# A

“`Q_A.go
package main

import (
“fmt”
)

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

var s string = “”
for i := 0; i

元記事を表示

ACL Beginner Contest 参戦記

# ACL Beginner Contest 参戦記

## [ABLA – Repeat ACL](https://atcoder.jp/contests/abl/tasks/abl_a)

1分で突破. 書くだけ.

“`python
K = int(input())

print(‘ACL’ * K)
“`

## [ABLB – Integer Preference](https://atcoder.jp/contests/abl/tasks/abl_b)

2分半で突破、WA1 orz. A < B < C < D のパターンを見落とした. ```python A, B, C, D = map(int, input().split()) if A <= C <= B or A <= D <= B or C <= A <= D or C <= B <= D: print('Yes') else: print('No') ``` ## [ABLC - Connect Cities](https://atcoder.jp/contests/abl/task

元記事を表示

cgoのg++用インクルードパス

分かってしまったらなんてことはないが、調べてもなかなか出てこなくて詰まったのでメモ。

環境:go version go1.15.2 linux/amd64

CGOでインクルードパスを指定するときには
“`// #cgo CFLAGS: -I<インクルードパス>“`
とすればよいが、これはgccでのコンパイルのときにしか使用されない。
cppファイルはg++でコンパイルされるので、この時のインクルードパスを指定したければ
“`// #cgo CPPFLAGS: -I<インクルードパス>“`
とする。以上。

元記事を表示

golangでPre-Signed URL(署名付きURL)を生成する

GolangでPreSignedUrlを発行するコードを書いたので残しておきます。

“`golang
package main

import (
“context”
“fmt”
“time”
“os”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/credentials”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/s3”
)

// S3の接続情報
accessKey := os.Getenv(“AWS_ACCSESS_KEY”)
secretKey := os.Getenv(“AWS_SECRET_KEY”)
region := aws.String(os.Getenv(“CUEE_DB_REGION”))

creds := credentials.NewStaticCredentials(accsessKey, secretKey, “”)
sessi

元記事を表示

Golangの環境構築

本記事はGo初心者の備忘録になります。

## 環境
OS: Mac Catalina
Shell: Zsh

## Go のインストール

#### homebrew でGoをインストール

“`sh
brew install go
“`

#### インストールが完了したか確認(バージョンも合わせて確認)

“`sh
go version
# 出力結果例) go version go1.15.2 darwin/amd64
“`

#### 環境変数$GOROOTの確認(Goのインストール先)

“`sh
go env GOROOT
# 出力結果例) /usr/local/Cellar/go/1.15.2/libexec
“`

#### 環境変数$GOPATHの確認

“`sh
go env GOPATH
# 出力結果例) /Users/ユーザー名前/go

ls $(go env GOPATH)
# 出力結果例) ls: /Users/ユーザー名前/go: No such file or directory
“`
※パッケージのインストールを終えていない段階では

元記事を表示

[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言語向けbash completionを使いたいという願望を叶える方法

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”)},
)
“`

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

“`

元記事を表示

OTHERカテゴリの最新記事