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

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

【Go】ビットを利用したフラグ管理

## 概要
Goでビット演算を利用したフラグ管理を行う実装を記述します。
複数指定可能なオプションを、constで定義している際などに使える便利な小技です。
Go以外でも、ビット演算を利用したオプション管理を実装している方は割と少なくないと思いますが、私自身これまでにビット演算を実装で使ったことがなく、「これは便利だわ〜」と感じたので、勉強ログ的なテンションで記述していきます。

## ビット演算子
|x | y|x と y の ビット論理和|
| :—: | :—: |
| x ^ y |x と y のビット排他的論理和|
| x & y |x と y のビット論理積|
| x << y |x と y の左シフト| | x >> y |x と y の右シフト|

## 実装
“`Go
type AmazonPrimeOpt uint64

const (
Video AmazonPrimeOpt = 1 << iota Music Photos Reading Gaming ) ``` 上記のようにオプション

元記事を表示

GolangでCloudFrontのAliaseドメインを更新するサンプル

## メモ
– 実際にCloudFrontの構成情報を更新するためには、指定したい部分を更新するというよりかは、構成情報をすべて送るイメージで実装する
– そのため、一度構成情報を落としてきて、それに対し変更を加えて、それをPUSHするというような流れを組む必要がある
– ETagとよばれるトランザクション管理するような値があり、更新系メソッドには必要
– 参照系メソッドを呼んだときに一緒に返却される

## サンプル

“`go
package main

import (
“fmt”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/awserr”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/cloudfront”
)

func main() {
id := “XXXXXXXXXXXXX”
sub_domain := “test02”
hosted_zone_name :

元記事を表示

Dockerを使用してGoでMySQLに接続しようと思ったら詰まった話

## 概要

現在**Golang**を学習しています。その中で**MySQL**との接続に詰まってしまったのでその解決方法を共有したいと思います。

## 前提

私は基本的に学習するときはローカルの環境を汚したくないので**Docker**を使用しています。
なので今回もDockerを使用して行います。
なお今回は、Dockerの構成を最低限しか設定しません。

### Dockerfile構成

“`dockerfile
FROM golang:1.19.0-alpine3.16
WORKDIR /app
COPY . .
“`

### docker-compose.yml構成

“`docker-compose.yml
version: ‘3.9’
services:
db:
image: mysql:8.0
container_name: mysql
env_file: .env
ports:
– 3306:3306
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_

元記事を表示

gRPCについて調査してまとめた?‍?

# はじめに
以前から、[Firestoreのリアルタイム同期にgRPCが使われている](https://qiita.com/namusyaka/items/71cf27fd3242adbf348c#google-firestore)ことや、(仕事でよく使う)Google CloudでgRPCの知識を求められる機会が多く、知的好奇心と必要性の両輪でgRPCへの学びの機運が高まっていました。

本稿は大きく分けて二部構成です。
前半ではgRPC関連の文献やテキストを読んでまとめたgRPC入門を、後半ではgRPCを利用して実装したチャットについて書いています。
前後半は独立しているので、gRPC入門にのみ関心がある方は前半だけ軽く目を通すのが良いかと思います?‍♂️

![chat2x.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287774/01f9575e-af42-8af5-be83-66531cbe705a.gif)

# gRPC入門
## 概要
gRPCはGoogle発、Remote Proc

元記事を表示

Goの「クロージャ」とは

## はじめに

Goを触り始めてクロージャというものに遭遇しました。

どういう機能なのか、理解した内容を書きます。

## 結論

関数内で状態を保持する機能

## 詳細

### docsでは

>Closure occurs when an anonymous function in Go has access to its surroundings. Then it can hold a unique state of its own. The state then becomes isolated as we create new instances of the function.
クロージャは、Goの無名関数がその周囲にアクセスできるようになったときに発生します。そうすると、それ自身のユニークな状態を保持できるようになります。そして、その状態は、関数の新しいインスタンスを作成するときに分離されます。
[Closures in GoLang – GoLang Docs](https://golangdocs.com/closures-in-golang)

元記事を表示

【#49 エンジニア転職学習】VirtualboxでUbuntu22.04の開発環境をつくる

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

簡単なアプリケーション開発を続けていきますが、
その前にLinuxの開発環境を整えようと思います。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。

https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
先日は今まで使用していたCentOS7にGoやVSCode等の開発ツールを入れましたが、
Ubuntuも使ってみたいと思い1から作り直しました。
* **VirtualBoxを使用してUbuntu22.04の開発環境構築 ←Topics!!**

# VirtualBoxを使用してUbuntu22.04の開発環境構築
導入したツールは先日投稿したCentos7にいれたものと同じです。
**①VirtualBoxにUbuntuを入れて初期状態までいく ②VSCodeでGo Install/Update toolsを導入する ③My

元記事を表示

Golangでログイン機能を実装する。(Step3:Validationチェックの結果に応じて、レスポンスを変更する。)

### はじめに
[前回記事](https://qiita.com/kouji0705/items/daebf3d721d86ee54868)の続きです。
前回までにオウム返しのAPIを作成しました。今回はリクエスト内容のValidationを実施し、レスポンスを変更するAPIを作成します。

### 成果物
リクエスト成功
![スクリーンショット 2022-08-11 15.20.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/cba06c87-555e-33be-6d1f-a681d7f6b1a3.png)

リクエスト失敗
![スクリーンショット 2022-08-11 15.20.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/6bae0fbe-e106-ebda-d04a-c7a2bae15343.png)

### Hands-on
“`shell:ディレクトリ構成
~/g

元記事を表示

Retty サマーインターン2022参加記

# 概要
この記事は、Rettyサマーインターン2022の参加記です。バックエンドでの参加でした。

# インターン概要
– 3週間
– 基本オンライン・出社も許可を取れば出来る
– GoとgRPCでマイクロサービスを開発
– 新しいマイクロサービスを設計から
– チーム開発・モブプロ
# 学んだこと
学びしかなかったです。というか、知っている技術領域や設計・開発思想等が一つもなかったので、当たり前なんですが。よく採用してくれたな…
## TDD
今まで開発でテストを書くことがほぼなかったですが、初めて書きました。その勢いで(?メンターさんの宗派もあり?)後半のほうはTDDで開発を行いました。私的な観点ですが、TDDのメリットとして
– 振る舞いを定義してから実装に移れる
– 途中で、「こういう時は異常系?」「あれ、この場合って何が返ってくるんだ?」が起こりづらい
– 見通しを立ててから実装できる
のような点があると思います。一方、見通しを立てないと実装に移れない。というデメリットもあると思っていますが。
テストを書くメリットもかなり学ぶことが出来、大満足でした。テストは絶

元記事を表示

Golangでログイン機能を実装する。(Step1:APIで値を返却する)

### はじめに
[前回の記事](https://qiita.com/kouji0705/items/cda9038c6d6e2d3c4efe)に付随する記事となります。
前回の記事まででは、UIコンポーネントを利用してログイン機能のデザインのみを作成しました。API疎通するためのバックエンドのシステムを作成します。本記事ではGolangでAPIを作成します。

### 環境情報
“`
PC:M2 Mac Book Air
Golang:go version go1.19 darwin/arm64
“`

### HelloWorld出力
本記事では、go fiberを利用してAPIを作成します。fiberを利用しHelloWorldを出力します。

“`shell:ディレクトリ構成
~/go/src/fiber_login$ tree
.
├── go.mod
├── go.sum
└── main.go

0 directories, 3 files
“`

“`go:go.mod
module fiber_login

go 1.19

require github.c

元記事を表示

M2 MacでGolangをインストールする。

## はじめに
表題通り、M2のMacでGolangをインストールします。HelloWorldが出るまでを確認する記事です。

### 環境構築
[リンク](https://go.dev)より、Golangのインストーラをダウンロードする。
![スクリーンショット 2022-08-10 19.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/cb0b6fd7-9ccd-5ec7-7220-3de19a00c221.png)

![スクリーンショット 2022-08-10 19.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/9f0bff6f-32eb-943f-9a3b-11b0cab6dde8.png)
→Apple MacOS(ARM64)をダウンロードする。

インストーラーでインストールする。

“`shell:インストールの確認
~$ go version
go

元記事を表示

初心者向け Goの学習方法 改良版

## はじめに
別の記事でGoの学習方法について記載しました。↓
[Goの学習方法](https://qiita.com/bear05/items/cea61cd116ef94f14e07)

しかし、前回の学習だけでは個人でアプリ開発をするのに不十分だったと感じ、追加で学習しました。
前回の記事の内容と、追加して学習したこと、効率がいい学習方法は何か、考えたことを記載します。

## 学習方法 改良
### 1.Goについて調べる
 複数のサイトを読んで、そもそもGoはどんな言語かについてざっくりと調べました。

参考記事
・[Go言語とはどんなプログラミング言語?特徴やできることを解説](https://hnavi.co.jp/knowledge/blog/go/)
・[Go言語とは – 作れるものや特徴を知ろう](https://www.pasonatech.co.jp/workstyle/column/detail.html?p=7489)
・[Goのエキスパートが教えるGoの魅力、プログラミング基礎入門](https://flxy.jp/media/article/10744

元記事を表示

goで未定義のJSONから一部の値のみ取り出す

goに限った話ではないが、複雑なJSONから一部だけ取り出したいといった場合に、その複雑なJSONのフォーマットを構造体として定義しておくのは面倒だ。そこで型を決めず`map[string]interface{}`に流し込んでおいて、あとでType-castingすれば取り出せるのだが、値が多段になっている場合など、なかなか書き方を調べるのが大変だったので、とりあえず動いたものを公開する。

対象となるJSONファイルは、このように直下にkey:valueがあるものや、valueが多段になっているもの、配列になっているものなどを想定している。

“`json:sample.json
{
“name”: “Hello”,
“value1”: {
“name”:”Hello1″
},
“value2”:[
{“name”:”Hello2-1″},
{“name”:”Hello2-2″}
]
}
“`

それに対して、コマンドラインでキーワードを指定して、

“`
jsontest ファイル名 キー

元記事を表示

Goでリリースビルドするときに最低限付けておきたいオプション

みなさん、Goでビルドするときには、どんなオプションを指定していますか?

Goでは`go build`だけでも何事もなくビルドできるので、特に何も指定していないという人もいるかと思います。
しかし、オプションを何も指定せずにビルドした実行ファイルには、デバッグ情報などのリリース時には不要な様々な情報が含まれています。

本稿ではリリースビルドを作成するときに最低限付けておきたいオプションについて、簡単に紹介したいと思います。

※ビルドオプションを網羅的に紹介する記事ではありません。

## リリースビルド時に最低限付けたいオプション

Goでリリースビルドを作成する時に最低限付けておきたいオプションは次の2つです。

– `-ldflags=”-s -w”`
– デバッグ情報(シンボルテーブル等)を含めないオプション
– ファイルサイズが小さくなります
– `-trimpath`
– ビルド環境のローカルパス情報を取り除くオプション
– (ユーザー名などが含まれた)ローカルPC上のパス情報の漏洩を防げます

実際にはこのような感じで使います。

“`sh
go b

元記事を表示

速度改善のためRailsコードをGoで書き直して、FFIを使ってみた

railsのコードをgolangに書き直したら、10倍早くなりました
===================================

ffiでgoを呼び出すようにすると早くなるという記事を見たので、

実際に使用してみたら、本当に10倍ほど早くなりました。

## ディレクトリ構成
今回はrailsなのでlib配下にffiディレクトリを用意して、その中にソースコードをおきました。

+ /app
+ /models
+ test.rb
+ /lib
+ /ffi
+ sample.rb
+ .directory-list.md
+ /src
+ sample.go
+ /model
+ data.go
+ /bin
+ sample.so

## 事前準備

ffiのgemを入れておく
“`
gem install ffi
“`

go.mod ファイル作

元記事を表示

ROT13をHaskell,Go,Rustで実装する

## 概要
腕試しにHaskellでROT13を実装してみた。
(GoとRustは以前に書いたものでこの記事としてはおまけです)

次の点を意識しています。

* 論理的に理解しやすいことが優先で、処理をまとめすぎない
* 数学的な思考を優先する (`$` を使って写像の合成を意識するぐらいですが)

## 指針

大まかに次の指針がある。

1. ローテーションの境界で場合分けする
a-m, n-z, A-M, N-Z で場合分けする(`mod`は使わない)
2. mod を使う
a-z, A-Z で場合分けし、ローテーションは `mod` を使って計算する
3. ROT13 の変換テーブルを用意する

今回は、1つ目のが多分一番理解しやすく、2つ目が自然な定式化で簡潔、3つ目がHaskell心をくすぐる書き方ができる…といった感じです。

## 解1: ローテーションの境界で場合分けする

a-m/n-z と A-M/N-Z で符号が変わるという知識をもとに実装する。
a-m, A-M の場合は 13 後ろにずらす。n-z, N-Z は前にずらす。

“`haskel

元記事を表示

インターン参加日記

DMMが開催する短期インターンに参加したので、その内容、感じたことを書こうと思います。

結論から言うと、最高でした!めっちゃGoの理解が深まりました笑

※ インターン内容公開の許可はいただいております。

## インターン概要
– 日数:5日間

– 実装方法:フルリモート

– 行ったこと:Goの学習、他のインターン生や社員の方々との交流

## スケジュール
1日目:オープニング、Go講義、社員雑談

2日目:Go講義

3日目、4日目:Go講義、演習

5日目:Go演習、解説、クロージング、LT会

### 1日目:オープニング、Go講義、社員雑談
前半では、会社説明やインターンの説明といったガイダンスや、インターン生の交流が行われました。

DMMは**理念が無く**、それ故あらゆる領域に踏み込めること、幅広い技術に触れることができる

元記事を表示

goplsやgoimportsでimport補完がバージョンを認識しないのを直す

## 問題

“`go:go.mod
module github.com/k0kubun/test

go 1.19

require (
github.com/k0kubun/pp/v3 v3.1.0
)
“`

“`go:main.go
package main

func main() {
pp.Println(1)
}
“`

が置いてあるリポジトリで `goimports main.go` すると、`import “github.com/k0kubun/pp/v3″` が補完されてほしいのに `import “github.com/k0kubun/pp”` が補完されてしまうことがある。

## 対処法
`”${GOPATH}/pkg/mod/github.com/k0kubun/pp@v3.0.1+incompatible”` など、go.mod非互換のバージョンが残っていると再現する。なので `”${GOPATH}/pkg/mod/github.com/k0kubun”` を丸ごと削除したあと以下をやり直したりすると良い。

“`
go mod dow

元記事を表示

【Go】reflectを使用した型判定で`reflect.Type`に無いものも使用したい

## 概要
あまり使うことは多くないと思いますが、例えばStructのフィールドを動的に取得する等の際に、reflectパッケージを利用します。reflectの概要等は、[reflectで動的に型を判定](https://www.wakuwakubank.com/posts/795-go-reflect/)の記事にまとめられています。
上記で紹介した記事では`reflect.Type`を使用して型の判定を行なっていますが、例えば`time.Time`型など`reflect.Type`に用意されていない型が含まれる時にどうするか。対応方法をメモ書きします。

## 対応
[Go type switch with time.Time](https://stackoverflow.com/questions/47739395/go-type-switch-with-time-time)のstackoverflowの記事にいくつか対応方法が紹介されています。
個人的には一度`Interface`型でreflectのvalueを取得した後に、型の判定をする方法が良いかなと感じました。

## 実

元記事を表示

GORMで動的なSQLの実行や検索のやり方

# やり方
GORMで動的なSQLの実行や検索を行いたい場合は、以下のようにGORMのSQLメソッドのDBインスタンスを受け取って、そのインスタンスでSQLを実行する必要があります。
“`go
db, err := gorm.Open(sqlite.Open(“test.db”), &gorm.Config{})
db = db.Table(“test_table”).Select(“*”)

// 動的に実行したいSQL
db = db.Where(“検索条件”)

// SQLの実行
rows, err := db.Rows()
“`

# 例
例えば`test.db`に以下の`user`というテーブルがあったとします。
|id |name |
|—|—|
|1 |たかし |

`user`テーブルのたかしの情報を検索したい場合、以下の様なコードを実行すれば、情報の取得ができます。
“`go
type User struct {
Id int
Name string
}

func main(){
db, err := gorm.Open(sqlit

元記事を表示

【#47 エンジニア転職学習】GinTutorialのWebApp改造 キーワード検索機能追加

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

GoのフレームワークであるGinを中心に、
webアプリ開発学習をしていきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。

https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
GinのTutorialで作成したAPIを改造して、簡素なWebアプリを作成しようと思います

* **GinとGORMを使用したAPIにキーワード検索機能追加 ←Topics!!**

# GinとGORMを使用したAPIにキーワード検索機能追加
先日投稿したコチラの記事で作成した簡素なアプリに(https://qiita.com/Chika110/items/a6decf1f5c49001a6ca3)、
キーワード検索機能を追加しました。

前回から変更点したファイルのみ記述します。
追加した検索機能でできるようになったことは、以下になります

元記事を表示

OTHERカテゴリの最新記事