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

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

Go 1.18 を触ってみた(Generics, Fuzzing, Workspaces)

# 初めに
Go 1.18がリリースされたので触ってみました。
今回の重要なリリースは下記の The Go Blog に掲載しているものだと思ったので、ここに書いてあるものを触ってみました。

https://go.dev/blog/go1.18

# 主な改善点
上記のページを見ると、今回のバージョンアップで特に注目すべきものは以下になります。

– Generics
– Fuzzing
– Workspaces
– 20% Performance Improvements

それぞれコードを交えながら、触ってみた感想と解説をしていこうと思います。

# Generics

日本語だと「ジェネリクス」と読みます。Javaを触ったことある人にとっては知ってて当たり前のものではないでしょうか。
Generics とは、1つのソースコードで様々なデータ型の処理をできるようにするものです。

The Go Blog には、最も頻繁にリクエストされていた機能だと書いてあります。つまりこの機能は多くの人が待ち望んでいた機能だと言えます。

親切にチュートリアルまで用意してくれています。今回はこ

元記事を表示

nil かもしれないメンバのある構造体の整列

# これは何?

https://qiita.com/sachiko-kame/items/e1315bff25e2abdb8639

という記事を見て、自分ならどう書くかなと思って書いたもの。
generics の練習を兼ねて

# まずはソース

“`go:go1.18
package main

import (
“encoding/json”
“fmt”
“math/rand”
“sort”

“golang.org/x/exp/constraints”
)

type Sample struct {
Name *string
Description *string
Note *string
}

func ToPtr[T any](x T) *T {
return &x
}

func NewSample(name, desc, note *string) *Sample {
return &Sample{
Name: name,
Description: desc,
Note: not

元記事を表示

XMLをスライスにUnmarshalするときの罠

スライスを `Marshal` して `Unmarshal` すると、**先頭要素しか取得できません**!

“`go:スライスをもとに戻せない?
package main

import (
“encoding/xml”
“fmt”
)

func main() {
nums := []int{1, 2, 3}
b, _ := xml.Marshal(nums)

var copiedNums []int
_ = xml.Unmarshal(b, &copiedNums)
// 先頭要素しか取れない!
fmt.Printf(“%#v\n”, copiedNums) // []int{1}
}
“`

JSONのように `Marshal` と `Unmarshal` を逆変換として使うことは**できません**。XMLをオブジェクトのシリアライズに使っている場合は注意が必要です。

# バージョン

Go 1.18

# Why?

スライスをmarshalすると各要素が並んだ形式で出力されます。

“`
[]int{1, 2, 3} → “1

元記事を表示

Go言語 HelloWorld

## Code
“`Go
package main

import “fmt”

func main() {
fmt.Println(“Hello, World!”);
}
“`
## Comment
Go言語は、「go run」コマンドによって、ビルドプロセスを隠蔽出来る。
もちろん、「go build」コマンドによって、明示的にビルドすることも出来る。

## Output Sample
$ go run hello.go
Hello, World!
$ go build -o hello hello.go
$ ./hello
Hello, World!

## GitHub
https://github.com/GL-Kageyama/Go_HelloWorld

元記事を表示

Golangのポインタで詰まったので備忘録

### 執筆の経緯
最近の静的型付言語ブームに乗っかって、Golangの勉強を始めました。
絶対詰まるだろうなと思っていたポインタでやっぱり詰まったので、20億番煎じくらいの内容ですが備忘録として残します。
保険をかける[^1]わけではないですが、初心者の備忘録なので誤っている箇所も多数あると思います。
是非ご指摘いただけると大変嬉しいです。
なお各コードの冒頭にThe Go Playgroundのリンクを付けてあります。
是非実際の動作を試したり、ちょっとイジって実験してみたりしてください。

### 筆者について
普段Vue.js / TypeScriptを業務で書いているフロントエンドエンジニアです。
趣味でReactやLaravelを触ったりはしてますが、Golangのような静的型付言語は初めてです。(Javaはほんのちょっと触ったことがある程度)

### 値渡しと参照渡しについて
“`main.go
package main

import “fmt”

func main() {
var age = 10
fmt.Println(age) // 10
}
“`

元記事を表示

Goのプログラム内でjqを使ってJSONを加工する

## はじめに

JSONデータをフィルタしたり、集計したりといった加工に`jq`コマンドは便利ですよね?

Goでプログラムを書いた場合も、プログラムの中でJSONを扱うケースは多々あると思いますが、
JSONの構造に合わせて構造体を定義してマッピングしたり、ちょっとした成形をしたりと面倒なことがあると思います。

今回は、`gojq`を使ってGoのプログラムの中でjqを使ってみましょう。
`gojq`はGoで書かれたjqコマンド実装で、Goのライブラリとしても使用できます。

gojq
https://github.com/itchyny/gojq

## 題材

ホットペッパーWebサービスに含まれる「グルメサーチAPI」の出力結果を一部取り出すGoプログラムを書いてみます。
https://webservice.recruit.co.jp/doc/hotpepper/reference.html#1

ホットペッパーWebサービスを呼び出す場合は、ユーザ登録が必要です。
「プライバシーポリシー」と「リクルートWEBサービス 利用規約」に同意し、メールアドレス認証を行います。

元記事を表示

【Go】VSCodeの実行で標準入力を行うと「noDebug mode: unable to process ‘evaluate’ request」が発生

## 概要
GoでAtCoderをやる時など、標準入力を使うと思いますが、VSCodeで実行時に`noDebug mode: unable to process ‘evaluate’ request`というエラーが発生しました。
なお、Goの標準入力の詳細については、[[1分学習]Goで標準入力を受け付ける](https://zenn.dev/tomatomato/articles/onemin_golang_stdin)の記事を参照ください。

## 対応
[こちら](https://github.com/golang/vscode-go/issues/2015)のissueを参照すると、VSCodeの`launch.json`へ設定追加が必要なようです。`”console”: “integratedTerminal”`の設定を追加すれば、動作しました。
念の為、`launch.json`の全体内容を以下に記載します。

“`json:launch.json
{
“version”: “0.2.0”,
“configurations”: [
{

元記事を表示

Goを使ってNotionカレンダーからGoogleカレンダーへデータを移動させてみる

# はじめに
NotionのカレンダーとGoogleカレンダーを両方つかっていましたが、
2つとも管理するのが煩わしくなってきたので、Googleカレンダーに統一しようと思いました。

そこでNotionAPIとGoogleCalendarAPIを使って、Notionカレンダー→Googleカレンダーへ
データを移動するプログラムをGoで作ってみました。

# それぞれのAPIの始め方
ひとまず両方ともAPIを触ったことがなかったので、公式のスタートガイドから概要を学びました。
スタートガイドとリファレンスについては下のリンクになります。
詳しいガイドの内容については割愛させて頂きます。

**NotionAPI**
[NotioAPIスタートガイド](https://developers.notion.com/docs)
[NotionAPIリファレンス](https://developers.notion.com/reference/intro)

**GoogleCalendarAPI**
[GoogleCalendarAPIクイックスタート](https://developer

元記事を表示

GOPATH と go module を理解するためのメモ

この記事はほぼ自分用メモです。

### 概要
– GOPATH, GOROOT, go mod を理解できてなくていろんなところでつまずく
– goenv 使わない限り GOROOT は気にしなくてもよさそうだから、とにかく GOPATH と go mod を理解したい
– 以下の記述はこれらのページを参照して自分用に整理したものなので、不明点・曖昧箇所があった場合はこちらを参照すること
– [Go のモジュール管理【バージョン 1\.17 改訂版】](https://zenn.dev/spiegel/articles/20210223-go-module-aware-mode)
– [Go1\.16からの go get と go install について \- Qiita](https://qiita.com/eihigh/items/9fe52804610a8c4b7e41)
– [go mod完全に理解した](https://zenn.dev/optimisuke/articles/105feac3f8e726830f8c)

### Go Modul

元記事を表示

gorm with PostgreSQL で Primary Key / ID を UUIDv4 にするには ( Docker 対応 )

# Motivation
– できるだけ gorm 標準の `gorm.Model` に準拠させた形にして、gorm の恩恵を受けたい

“`go
import (
“gorm.io/driver/postgres”
“gorm.io/gorm”
)

type Product struct {
gorm.Model
Code string
Price uint
}
// → このままだと PK が uint / auto_increment フィールドになる
“`

# 結論
以下のサンプルコードをご覧ください。

“`go
type UUIDBaseModel struct {
// UUID が主キーになり、UUID は Postgres が勝手に生成する
ID string `gorm:”primaryKey;size:255;default:uuid_generate_v4()”`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:”index

元記事を表示

SQL Boilerでintで生成されるフィールドをint32にする

SQL BoilerはDBスキーマから構造体などを生成してくれる便利ORMです。
DBスキーマの型からGoの型にいい感じにマッピングしてくれるのですが、DB(ここではPostgresSQL)でintegerで定義したものはGo上ではintで表現されるようになります。
これでも特に困らないことは多いのですが、OpenAPIやProtocolBuffersなどから生成されるGoのコードではintはint32で定義されるので、これらと相互に変換する際にはint32になっていたほうが都合が良いです。
intとint32の変換であればそこまで大変ではないのですが、 null許可されたカラムはnull.Intと*intで表現されるため、これを*int32にキャストはとてもめんどうです(めんどうというかやり方がわからなかった。)
*intを避けるのであれば、DBスキーマでNULL許容しなければよいという話ではあるのですが、その話をすると長くなるのでここではやめ、*intと真剣に向き合うことにします。
とは言え方法は簡単で、SQL Boilerの設定ファイルに以下のように記載するだけです。
“`to

元記事を表示

golangのnilとか入った構造体のsortこんな感じでOKそう?

# はじめに
結果みる感じ問題なさそうですが、
不安だったので、
不安そうなタイトルにしました!:chicken:

もっとシンプル綺麗に書けるよ!
という優しい方がいたら教えて頂けると嬉しいです!:bow_tone1:

お試し等は以下にペタッと貼り付けたりして動かすといいのではないかと思ってます!
https://go.dev/play/

# 主な参考
https://stackoverflow.com/questions/48331747/ignore-nil-elements-when-sorting
https://qiita.com/Sekky0905/items/2d5ccd6d076106e9d21c

# 以下実行した場合の最初と最後の出力結果比較

“`.txt
何もしない場合の出力確認

名前01 説明2
名前02 メモ2
名前01 説明1
説明1

名前02 メモ1

sort場合の出力確認(3回目)
名前01 説明

元記事を表示

Go言語におけるJSONのDecodeの注意点・対策

ここ数ヶ月、APIのレスポンスをParseする処理をGo言語で書く機会がたくさんありました。
APIから返ってくるJSONの形式によっては、`json.Unmarshal` ではどうにも太刀打ちできないことが何度かありました。

Go言語でJSONをParseする際に注意すべきこと、使える手段についてまとめておきます

# 何はともあれコレ! `json.Unmarshal`
– `func Unmarshal(data []byte, v interface{}) error`
– 標準ライブラリ `json` のメソッド。
– json形式のbyte列を受け取り、Parseして `v` が指す値に格納する。第二引数 `v` はpointerでなければならない。

“`golang:サンプルコード
import (
“encoding/json”
“fmt”
)

func main() {
var jsonBlob = []byte(`[
{“Name”: “Platypus”, “Order”: “Monotremata”},
{“Name”: “Quoll

元記事を表示

go関連で見た記事 2022/03/30

https://qiita.com/tchnkmr/items/b3d0b884db8d7d91fb1b

https://zenn.dev/kou_pg_0131/articles/go-digest-string

https://chidakiyo.hatenablog.com/entry/2017/12/12/%E5%BF%98%E3%82%8C%E3%81%8C%E3%81%A1%E3%81%AAGo%E3%81%A7byte%E3%82%92string%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC

https://qiita.com/ktnyt/items/8ede94469ba8b1399b12

“`golang
package main

import (
“bufio”
“fmt”
“log”
“os”
)

func main() {
f, err := os.O

元記事を表示

今日読んだgoの記事 2022/03/29

# 今日読んだgoの記事 2022/03/29
## goでどうスクレイピングするのか。
https://medium.com/@arnesh07/how-golang-can-save-you-days-of-web-scraping-72f019a6de87

要約
スクレイピングのメインはPython。
じゃあなんでGo? => Goのほうがはるかに早い。(単位時間あたりの処理量が倍くらい違う)
goのスクレイピングにはgoqueryを使う。
goqueryはjqueryライクである。

## goqueryのダウンロード方法
https://rooter.jp/web-crawling/go_goquery_scraping/

要約
go get github.com/PuerkitoBio/goquery

** collyとはなんぞ
https://qiita.com/ta9to/items/6a4c2ce646bc642c42b4

要約
go のスクレイピングライブラリ

## マーシャル
https://www.asobou.co.jp/blog/web/marsh

元記事を表示

gRPC+Go を触ってみたので、ざっくり纏めてみた [ハンズオンつき]

## はじめに
最近、社内でマイクロサービスが話題に上がるにつれ、
gRPCという言葉をよく聞くようになりました。

前から興味があったことと、今後業務でgRPCで使う可能性がありそうとのことだったので、
概要と雰囲気を掴むために記事にまとめてみました。

## 記事の読み進め方
記事の内容を下2つに分けてgRPCを理解を深めていきます :eyes:
* [gRPCの概要](https://qiita.com/mnoji/items/20895275d923f02821fd#grpc%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%AB)
* [簡単なハンズオン](https://qiita.com/mnoji/items/20895275d923f02821fd#%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3)

## gRPCってなに?
Google が開発した RPC(Remote Procedure Call)システムです。

特徴をざっくりとまとめますと、以下のようなもの
* HTTP/2 通信をベースに高速かつ効

元記事を表示

goenvの設定

## 一部localでの動かし方(1.13.5に設定する場合)

pathが通っていない場合は、
“`
goenv local 1.13.5
export PATH=~/.goenv/versions/1.13.5/bin:$PATH

“`

元記事を表示

Windowsにgo言語をインストールする方法

1. [Go言語の公式ページ](https://go.dev/dl/) からmsiファイルをダウンロードする。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/60a8923e-7659-eefa-ac74-d34f11bdcea6.png)
2. ダウンロードした `go1.18.windows-amd64.msi` をダブルクリックする。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/4a6a013c-7bf2-317b-8144-afad9e3e9372.png)
3. `Next` を押下する。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/ab4a539e-e2ec-2943-5cc6-a5e6a649785d.png)
4. `Next` を押下する。
![

元記事を表示

Go言語のエラーハンドリング(2022年版)

半年前にGo言語で開発を行うチームにJoinし、初めてGo言語を書く経験をしました。
自分やチームメンバー向けのメモとして、調べたことをまとめておきます。

# 1. Goのエラーハンドリングを考える上での前提知識(ざっくり)
– Go言語には、他の言語にあるような例外(throw, catch…) の機能が存在しない。
– Go言語は簡潔さを重視した言語のため、基本的に「例外は使うべきではない」という思想に基づいて作られている
– その代わり、メソッドのエラーハンドリングをしたい場合は、主にメソッドの返り値として `error` 型の変数を返すことが推奨される
– 主要なライブラリもこのルールに基づいて作られている
– 例: `json.Marshal`
– jsonへのParseに失敗した場合、2番目の返り値としてerrを返す。
– `err` が `nil` でなければ処理中に問題が起きたと判断し、呼び出し元でエラー対応を行う必要がある
“`golang
s, err := json.Marshal(input)
i

元記事を表示

Git にコミットされない魔法のデバッグ用ロガーを開発してきた

こんにちは。[task](https://github.com/task4233)です。

先日、メルカリ主催の「Online Spring Internship for Gophers 2022」に参加してきました。

このイベントでは、[募集要項](https://mercan.mercari.com/articles/31914/)に書かれている通り、Go1.18で新しく入る型パラメタ(ジェネリクス)、Fuzzing、Workspaceについて学んだ上で、参加者各自がGo1.18の新機能を用いたツールを開発しました。

私はそこでアイデアや設計などのサポートをしていただき、Git にコミットされないデバッグ用ロガーである `dl` を開発しました。この記事では開発の背景や使い方、仕組みについて紹介します。

https://github.com/task4233/dl

このロガーの特徴は以下の3つです。

1. **Git にコミットされないGoのデバッグ用ロガー**
2. **既存の `logr.Logger` 構造体も利用可能**
3. **1コマンドで環境構築可

元記事を表示

OTHERカテゴリの最新記事