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

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

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イン

元記事を表示

コマンドラインでAzure Functions Custom Handlerをデプロイする(Go / HTTP trigger編)

# はじめに

[Microsoft Azure](https://azure.microsoft.com/ja-jp/?WT.mc_id=AZ-MVP-5004244)のFaaSである[Azure Functions](https://azure.microsoft.com/ja-jp/services/functions/?WT.mc_id=AZ-MVP-5004244)において、GoやRustはネイティブにサポートされておらず、Custom Handlerという仕組みを使って実現されています。

– [Azure Functions のカスタム ハンドラー | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-custom-handlers?WT.mc_id=AZ-MVP-5004244)

また、[Visual Studio Code](https://code.visualstudio.com/)と[Azure Functions エクステンション](https:/

元記事を表示

【Go, Mysql】 DBに指定したidがあればinsert, なければupdate を行う

# Go , MySql で 指定したidにレコードがなければinsert, あればupdateを行う

dockerのMySqlにplacesテーブルを作成後、初期データをinsertしたかったため、primary keyのidをauto incrementせずにidを指定してinsertを行うようにした。

しかし、下記の場合だと、再度実行する際にDBにレコードが入っており、primary keyが重複するというエラーが発生した。
“`go:db.go

func init(){
cmd := fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s(
id INT PRIMARY KEY,
name TEXT,
address TEXT)`, places)
Db.Exec(cmd)

insert_init_data()
}

func CreatePlace(id int, place string, address string) (err error) {
cmd := `insert into places(

元記事を表示

Docker-composeを使ってGoの実行環境の作成

# はじめに
Goを使ったプログラムを書きたかったのでコンテナを使い簡単に環境構築を行おうとしました。今回はホットリロード機能も付けた状態となります。備忘録としてまとめます。

# 構成
go
├ app
│ ├── go.mod
| ├── main.go
│ └── .air.toml
├ Dockerfile
└ docker-compose.yaml

# ファイルの作成
## Dockerfile
“`sh:Dockerfile
# goバージョン
FROM golang:1.17.9-alpine
# アップデートとgitのインストール
RUN apk add –update && apk add git
# appディレクトリの作成
RUN mkdir /go/src/app
# ワーキングディレクトリの設定
WORKDIR /go/src/app
# ホストのファイルをコンテナの作業ディレクトリに移行
ADD . /go/src/app
# ホットリロード用
RUN go install github.com/cosmtrek/air@v1.27.3

元記事を表示

Vue3 + leafletで格安薬局マップを作った件

[表示地域の格安薬局がひと目でわかるマップ](https://tobizaru.github.io/pharmacy_map/map/)を作成しました

![Screenshot_20220507_231416.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657882/c1e5001c-6a77-1107-07d6-0f57483cace3.png)

## 薬の価格はどこの薬局でも同じではないのか

実は薬の価格はどこの薬局でも同じ、ではありません。

詳しくは[こちら](https://pharmacyassistant.xyz/entry/yasui-yakkyoku-ranking/)などで調べていただければわかりますが、
簡単に言えば、国は下記のような薬局により多くの報酬が得られるよう法律を定めています。

– 実績として特定の病院ではなくいろいろな病院の処方箋を受け入れている薬局
– 大手でない小さな薬局、お客の少ない薬局
– ジェネリック医薬品をたくさん準備している薬局

この報酬は全

元記事を表示

go初学者の勉強用サイト

# goをこれから勉強したいあなたへ

この記事を見たあなたはナウでヤングなエンジニアに大人気のgoに興味があってこの記事の門を叩いたに違いありませんね.
goで開発を初めて1ヶ月の若輩者が、勉強の役に立ったもの(無料)をペタペタするので興味がある方はぜひ!
ちなみに、プログラミング未経験者には難しいのであまりオススメできません🥲

– [Go Playground](https://go.dev/play)
いますぐ “Hello world!!” してみたい方はこちら!
ブラウザですぐにgoのコードを試すことができます

– [とほほのGo言語入門](https://www.tohoho-web.com/ex/golang.html)
自分はこの記事をもとにAWSのCloud9に環境構築してUdemyの一番人気のやつで勉強しています。
環境構築に5分もかからなかったので激烈オススメです!
環境構築した後は、すぐに基礎を学びこともできます。

– [A Tour of Go](https://go-tour-jp.appspot.com/)
goの公式基礎学習サイトです。
ただ、基

元記事を表示

Go: GitLab API の使い方

トークンとプロジェクトID の設定

“`text:.env
PERSONAL_ACCESS_TOKEN=glpat-xxxxxx
PROJECT_ID=”35195199″
“`

## プロジェクトのメンバーの取得 ##

“`go:get_member.go
// —————————————————————
//
// get_members.go
//
// May/07/2022
// —————————————————————
package main

import (
“os”
“fmt”
“io/ioutil”
“net/http”
“encoding/json”
“github.com/joho/godotenv”
)

// —————————————————————
func main()

元記事を表示

Go言語 main.go 以外の関数がundefinedになる問題を解決

# Go言語のmain.go以外のファイルに定義した関数がdockerでundefined

go, mysqlコンテナを使用したアプリケーションで、以下のDockerfileの場合にエラーが起きた。

“`Dockerfile:Dockerfile
FROM golang:1.17.6-alpine
RUN apk update && apk add git
WORKDIR /go/src
CMD [“go”, “run”, “main.go”]
“`

docker-compose up したところ、 コンテナがexit していたため、ログを確認したところ、main.go以外のmianパッケージが読み込まれていないとのことだった.

スクリーンショット 2022-05-06 21.04.40.png

元記事を表示

OTHERカテゴリの最新記事