Go関連のことを調べてみた2022年05月17日

Go関連のことを調べてみた2022年05月17日
目次

【備忘録】Golangでスライスを利用する。

## Golangで1次元スライスを利用する

“`golang:main.go
package main

import “fmt”

func main(){
// 1次元スライス
s1 := []int{1, 2, 3}
s2 := []int{5, 6, 7}

// 1次元スライスに要素を追加する。
s1 = append(s1, 4)

fmt.Println(“s1: “,s1)

// 1次元スライスに1次元スライスを追加する。
s1 = append(s1, s2…)

fmt.Println(“s1: “, s1)
}
“`

“`shell:実行結果
~/go/src/array_slice $ go run main.go
s1: [1 2 3 4]
s1: [1 2 3 4 5 6 7]
“`

## Golangで2次元スライスを利用する
“`golang:main.go
package main

import (
“fmt”
)

func main() {
s1 := [][]int{{1

元記事を表示

インターフェースとローカルな構造体

ginのsessionsを見ていた際にこんなのがあったのでメモとして。
外部にはインターフェイスとして公開し内部ではローカルな構造体として定義しそれで処理を行なっている。

“`golang
type Session interface {
MethodA()
MethodB()
}

type session struct {
}

func (s *session) MethodA() {
}

func (s *session) MethodB() {
}
“`

元記事を表示

GOの構造化ロガーlogrusが非推奨になったため代替ロガーZerologを使ってみる

# はじめに

昨今ログ集計用に構造化ログは必要不可欠となっており、logrusとはGO用の構造化ロガーで多くのプロジェクトで使われていました。

しかし現状はメンテナンスモードとなっており、今後新機能は追加される予定はないようです。(※以下原文)

README原文から抜粋
>Logrus is in maintenance-mode. We will not be introducing new features.
This does not mean Logrus is dead. Logrus will continue to be maintained for security, (backwards compatible) bug fixes, and performance (where we are limited by the interface).

https://github.com/sirupsen/logrus

REAEME原文から抜粋
>Logrus would look like those, had it been re-designed with

元記事を表示

【Golang】ビルド/コンパイル時に利用するファイルを、特定の Go バージョンに限定する【下位互換の持たせ方の一案】

go:build で Go バージョン別指定

> Go 言語(以下 Golang)でビルドを実行する際に、**Golang のバージョンによってコンパイル時に含める・利用するファイルを限定したい**。

つまり、`go:build` で特定の OS や `cgo` の有無で利用するファイルを分岐させるように、コンパイル時に利用している Golang バージョン別に分岐させたいのです。

[「golang “go:build” ビルド時 特定のGoバージョンでのみ利用 コンパイル」でググって](https://www.google.com/search?q=golang+%22go%3Abuild%22+%E3%83%93%E3%83%AB%E3%83%89%E6%99%82+%E7%89%B9%E5%AE%9A%E3%81%AEGo%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%A7%E3%81%AE%E3%81%BF%E5%88%A9%E7%94%A8+%E3%82%B3%E3%83

元記事を表示

Go の気になったコミット (2022 年 4 月)

[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。

前回作成したリストはこちら。

https://qiita.com/sg0hsmt/items/d74d96095b83f15746de

軽く説明を追加していますが勘違いや誤りがあるかもしれません。

## Topic

## Commits

### 2022-04-01

https://github.com/golang/go/commit/37065847d87df92b5eb246c88ba2085efcf0b331

楕円曲線暗号で使用する P-256 の処理で panic を起こす問題が修正されています。 [^1] [^2]
この修正はバックポートされており Go 1.17.9 および Go 1.18.1 がリリース済みです。

[^1]: https://github.com/golang/go/issues/52075
[^2]: https://github.com/advisorie

元記事を表示

golang インターフェースからコードの自動生成

調べているうちにそもそもVSCodeにこの拡張機能があったのでやめたが、その作業記録として。

# Work
https://github.com/progllama/interface-realize

# .gitignoreの導入
## OS
### macOS
https://github.com/github/gitignore/blob/main/Global/macOS.gitignore

## IDE
### VSCode
https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore

## Language
### Go
https://github.com/github/gitignore/blob/main/Go.gitignore

# VSCodeの設定
## Official
https://code.visualstudio.com/

## spell checker
https://qiita.com/diescake/items/98c5a099e8

元記事を表示

カスタムプロバイダを自作したらTerraformの仕組みをよく理解できた

# はじめに
個人で使うにはAWSお金かかりすぎますよね。格安VPSをお手軽に使えるようにTerraformで管理したいと思い調べたところ、ConoHA VPSとさくらのVPSが対応していると分かりました。でももっと安いVPS、WebARENA Indigoがあり、これをTerraformで何とか使いたいと思い、カスタムプロバイダを自作してみました(作ってみたものの結局、実用的かと言われると怪しい笑)。

# Terraform Custom Provider
Terraformの説明はいまさらなので省略するとして、どうやらカスタムプロバイダが作れるようなので軽く調べてみました。Qiitaにもいくつか記事がありますが、バージョンが古かったりと結局は[公式ドキュメント](https://learn.hashicorp.com/collections/terraform/providers)を参考にしました。

## Terraform plugins
ざっくりまとめると、CRUDに対応したクラウドAPIを呼び出すプラグインを[SDK](https://github.com/hashico

元記事を表示

VSCode devcontainerでGinの開発環境を構築するテンプレートを作りました

# 概要
今回作成したテンプレートを使うと、ローカル環境を汚すことなく、コード補完、静的解析、デバッグ等のGoの開発ツールの恩恵を受けつつGinアプリケーションを開発できる環境を構築できます。
コード内容は以下のリポジトリより確認できます。

https://github.com/rootsuke/gin-devcontainer-template/tree/master

# 構築される環境
* Go 1.18
* Gin
* air
* gopls, staticcheck, dlv等のGo開発ツール

# 動作環境
* Docker
* VSCode
* Remote – Conatainers (VSCodeの拡張機能)

# 使用方法
1. Open Folder in Conatainerをクリック
2. コンテナのビルドが完了したらターミナルを開いて `air` と入力

上記手順が完了すると `localhost:8080` にてサンプルコードのJSONが表示されます。
以降はairがホットリロードを行ってくれますので、変更内容が自動で反映されます。

実際のアプリケー

元記事を表示

DDDの各層について

# はじめに
この記事は正しくは「DDDで採用されることの多いアーキテクチャが持つ層について」です。
#### 対象読者
DDDについて軽く勉強した人
DDDを採用していて、アーキテクチャについて調べ直したくなる時がある人

#### 記事で論じないこと
そもそもDDDとは何か
DI、DIPといったアーキテクチャの話

#### 記事で論じること
DDDで採用されるアーキテクチャの各層について

# 概要
DDD(ドメイン駆動設計)で採用されることが多い、レイヤードアーキテクチャ、クリーンアーキテクチャ、オニオンアーキテクチャ、etc..が持つ**層**について理解を深める

#### 層とは
本記事で指す層とは、プレゼンテーション層、アプリケーション/ユースケース層、ドメイン層、インフラストラクチャ層である

#### 備考
本記事では主にアプリケーション/ユースケース層、ドメイン層について記載
内容の不備/間違いはご指摘ください
Go的な観点で書いています

# ドメイン層
#### 役割
ドメインモデルを表現すること
※DDDにおけるドメインとは、ソフトウェアによって解決したい

元記事を表示

【MySQL】【Go】this user requires mysql native password authentication.

go-sql-driverで`this user requires mysql native password authentication.`エラー

# 結論
my.ini
“`
[mysqld]
default_authentication_plugin=mysql_native_password
“`

# 詳細
このエラーで調べると、 `AllowNativePasswords: true` を設定するように書いているのですが、これだけだと繋がらない場合はmysql側の設定を見直します。
https://qiita.com/ushio_s/items/ab64e7e9222bb5a67a11

# 参考
https://github.com/go-sql-driver/mysql/pull/644/files

元記事を表示

JSON Schema の力で書きやすいオレオレ YAML ファイルを作る

YAML を用いる独自の設定ファイル(いわゆる「オレオレ YAML」)を作る際は、その YAML ファイルのスキーマ (その設定ファイルがどのような key, value を持つべきなのかの情報) を [JSON Schema](https://json-schema.org/) として書いて紐付けを行うと、エディタのサポートが得られて便利、という話をします。

## JSON Schema を用意すると、YAML Language Server が補完等を行ってくれる

YAML ファイルの記述を支援するツールとして、[YAML Language Server](https://github.com/redhat-developer/yaml-language-server)[^1] があり、YAML ファイルのバリデーション、入力の補完や、値の説明などを行ってくれます。

[![](https://raw.githubusercontent.com/redhat-developer/vscode-yaml/main/images/demo.gif)](https://github.

元記事を表示

[golang]list内の重複した値を消す

“`
package main
import “fmt”
func main() {

people := []string{“tanaka”, “sato”, “koike”, “tanaka”, “sato”}

unique := make([]string, 0, len(people))

m := make(map[string]struct{})

for _, v := range people {
if _, ok := m[v]; ok { //重複している際はok(true)となる
fmt.Println(ok)
continue //continueが終わった後再びforループの先頭に戻る
}
unique = append(unique, v)
m[v] = struct{}{} //重複を消す処理

}
fmt.Println(unique) //出力:tanaka sato koike
}
“`

元記事を表示

GoでLambda Function URLs ハンズオン

# はじめに
この記事はGoでLambda Function URLsをハンズオンしてみる内容となっています。
筆者がLambdaでGoを扱うこと自体が初めてだったため備忘録として簡単に環境構築からデプロイまでの手順も載せています。

# 環境
MacBook Air M1

# ハンズオン

ランタイム Go1.xを選択後、
Lambdaの関数の作成画面で詳細設定を開き “関数URLを有効化”をチェックします。
(認証はパブリックな利用を想定してNONEを設定しました。)
![function_urls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391445/8b50af02-81e4-6645-cfa6-748df1ee3db9.png)

ランタイム設定のハンドラが`hello`となっているので適当な名前に変更します。
![runtime_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391

元記事を表示

【個人開発】今スーパーで安い食材と関連レシピをラインで探せるボットの友達が1000人超えたのでログを晒していく

以前「[レシピ作家のレシピを検索できるトイアプリがちょいバズったので爆速でLINE Botを作った話](https://qiita.com/kazukinagata/items/e40dd5ecc143532329e8)」という記事で紹介させていただいたラインボットの友達が1,000人を超えていたので、ユーザーの利用状況をログから分析して晒していきます。

![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201783/db8c51e1-3700-efc1-1a16-49351d2fa767.png)

※ラインボットやスクレイピングなどの技術的な話は前記事に譲って、本記事では技術については触れません。

## どんなボットなのか

1. イオン、イトーヨーカ堂、西友3社のネットスーパーから、今安くなってる食材を検索できる
2. 食材名から、リュウジさんや山本ゆりさんなど著名な料理研究家さんの関連レシピを探せる

というのが主な機能です。

【Golang】Goroutineまとめ

# Goroutineとは
並列処理のこと。他の言語だとマルチスレッドなどと言われる。

# 49 GoroutineとSync.WaitGroup
normal()とgoroutine()を並列で実行する場合、どちらかのメソッドにgoを頭につけて実行する。
“`go
package main

import (
“fmt”
“time”
)

func goroutine(s string) {
for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func normal(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { go goroutine("world") normal("hello") } ``` ``` hello world world hello hello world

元記事を表示

go: json.Unmarshal(data, slice)

“`go
package main

import (
“encoding/json”
“fmt”
)

func main() {
cases := []struct {
in []byte
}{
{
in: []byte(`[]`),
},
{
in: []byte(`null`),
},
{
in: []byte(“),
},
{
in: []byte(nil),
},
}
for _, tt := range cases {
out := []string{}
err := json.Unmarshal(tt.in, &out)
if err != nil {
fmt.Printf(“FAIL: %#v, err: %v\n”, []byte(tt.in), err)
} else {
fmt.Printf(“PASS: %s, out: %#v\n”, []byte(tt.in), out)
}
}
}
“`

“`go
PASS: [], out: []stri

元記事を表示

[Karabiner-Elements] イコール (=) を長押ししたらコロンイコール (:=) と入力できるようにする

# 概要

Go を書いているときに、代入文で `Shift-;` + `=` と入力するのが少々面倒だったので、
`=` を長押ししたら `:=` と入力できるようにしました。

# Karabiner-Elements とは

https://karabiner-elements.pqrs.org/

# 設定

`~/.config/karabiner/karabiner.json` を開いて
`profiles > complex_modifications > rules` の中に下記ルールを追加してください。

“`json
{
“description”: “イコール(=)を長押ししたらコロンイコール(:=)に置換する”,
“manipulators”: [
{
“from”: {
“key_code”: “equal_sign”,
“modifiers”: {
“optional”: [
“ca

元記事を表示

【Golang】Structオリエンテッドまとめ

# 39 メソッドとポインタレシーバーと値レシーバー

### メソッド
#### 構造体の値を関数で使用する場合
“`go
package main

import “fmt”

type Ver struct {
X, Y int
}

func Area(v Ver) int {
return v.X * v.Y
}

func main() {
v := Ver{3, 4}
fmt.Println(Area(v))
}
“`

“`
12
“`

Area()と構造体Verに結びつきがない

### 値レシーバー
オブジェクト指向のクラスとメソッドのように、構造体のメソッドのような形が作れる

“`go
package main

import “fmt”

type Ver struct {
X, Y int
}

func (v Ver) Area() int {
return v.X * v.Y
}

func main() {
v := Ver{3, 4}
fmt.Println(v.Area())
}
“`

“`
12
“`

###

元記事を表示

【Golang】ポインタまとめ

# 34 ポインタ
“`go
package main

import “fmt”

func main() {
var v int = 10
fmt.Println(v)
fmt.Println(&v)

var p *int = &v
fmt.Println(p)
fmt.Println(*p)
}
“`

“`実行結果.go
10
0xc0000160c8
0xc0000160c8
10
“`

# 36 struct
“`go
package main

import “fmt”

type Vertex struct {
X, Y int
S string
}

func main() {
v := Vertex{X: 1, Y: 2, S: “ver”}
fmt.Println(v)

v4 := Vertex{}
fmt.Printf(“%T %v\n”, v, v4)

var v5 Vertex
fmt.Printf(“%T %v\n”, v5, v5)

// ポインタ
v6 := new(Vertex)
fmt.

元記事を表示

Goにおけるレシーバの型について

下記の様なコードがあるとします。

“`go

package main

import “fmt”

type Greet interface {
sayGreet() string
}

type Hello struct {
Message string
}

func (h *Hello) sayGreet() string {
return h.Message
}

func createGreet() Greet {
return Hello{Message: “こんにちは”}//ここでコンパイルエラー
}

func main() {
g := createGreet()
fmt.Println(g.sayGreet())
}

“`
今このコードは、createGreet関数のreturnの箇所でコンパイルエラーを起こしています。

なぜなのか。

createGreet関数の返り値はGreetインターフェイスです。

ということは

“`go
return Hello{Message: “こんにちは”}
“`
上記で返される返り値がGreetイン

元記事を表示

OTHERカテゴリの最新記事