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

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

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.

元記事を表示

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

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

また、[Visual Studio Code](https://code.visualstudio.com/)と[Azure Functions エクステンション](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azuref

元記事を表示

【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

元記事を表示

2年目エンジニアのClean Architecture

この記事では、Clean Architectureの概要、構築をまとめています。

すでにこれらの内容を含んだ記事は多く存在していますが、私自身2年目に突入したことを機により理解を深めたいと思ったため、本記事を投稿するに至りました。

私ごとではありますが、今回初の投稿となりますので、過不足な点や分かりづらい点などがございましたら、ご指摘など頂けますと幸いです。

今回特に@hirotakanさんの[Clean ArchitectureでAPI Serverを構築してみる](https://qiita.com/hirotakan/items/698c1f5773a3cca6193e)を参考にさせて頂きました。
本記事は私が勉強がてら投稿したものになりますので、私のような初学者でこれから学習をしたい方には先述の記事をぜひオススメします。

# Clean Architectureの概要
![CleanArchitecture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2490180/f7277839-

元記事を表示

golangでパッケージを作成してmain.goから読み込んだらエラー

go言語を勉強中。
環境Windows10
VSCODE
go 1.17.7

プロジェクト名のディレクトリの下にmain.goを作成して
その下にmylibというディレクトリを作りました。
その中にgoファイルを作成して関数を作り。
main.goでその関数を呼び出そうとしたら以下のエラーなりました。
““
main.go:4:2: package projectname/mylib is not in GOROOT (C:\Program Files\Go\src\projectname\mylib)
““

この問題について以下の記事がありました。
[[GO言語]GOPATH以外の場所でのimportの挙動について整理](https://qiita.com/fetaro/items/31b02b940ce9ec579baf)

しかし、Go 1.16からGo-Moduleによるプロジェクト構成が推奨されたらしいという記事を発見しました。
“`
cd projectname
go mod init projectname
““

でモジュールを認識して実行するとこが

元記事を表示

【Golang】Goa✖️golang-migration✖️gorm でCRUD APIを実装する。

# まえがき
[前記事](https://qiita.com/crml1206/items/ccdf62e713e3c9599fd5)でGoaプロジェクトの環境構築を行なった。本記事ではgoaプロジェクトで[golang-migration](https://github.com/golang-migrate/migrate)と[gorm](https://github.com/go-gorm/gorm)を利用してCRUD APIを実装してみる。

 ① docker compose up でPostgreSQLコンテナ起動
 ② `golang-migration`でDBスキーマ作成
 ③ `gorm`でEntity作成・DB接続・CRUD処理実装
 ④ 動作確認

ソースだけ見たい人向け。

https://github.com/daisuketakakuwa/inventory-system

goaのGitHubにexampleプロジェクトがいくつかあるので、プロジェクト構成やコーディング等参考になるのでリンクを貼っておく。

https://github.com/goades

元記事を表示

可変長配列に要素を追加する処理の色々

# これは何?

go の slice や C++ の std::vector のようなものに要素を追加する場合に世の人々がどうするのかを調べた。

# そもそも

いわゆる可変長配列というものの代表的な実装は

* 適当にメモリ確保して、そこに要素を格納する
* 確保した容量に入らなくなったら、別の場所にメモリを確保して、そこに全部移動してから新要素を追加する

というものになっている。
この「別の場所にメモリを確保」の際にどうするのかが悩みどころ。
必要サイズぴったりにメモリ確保すると「1個追加」を1000回行った場合に絶望的に遅くなる。
多めに確保したいところだけど、多すぎるのはやっぱり損。

みんなどうしているのかなと思って調べてみた。

# 各実装

## go の slice

https://github.com/golang/go/blob/go1.18.1/src/runtime/slice.go#L193
辺りに実装がある。

1. 旧キャパシティが 256未満なら、新キャパシティは旧キャパシティの倍。
1. 旧キャパシティが 256以上なら、新キャパシティは旧キャ

元記事を表示

OTHERカテゴリの最新記事