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

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

【CDK】 色んな言語でCRUD API作る【Go】

# この記事について
[AWS CDKv2](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-construct-library.html)でCRUD操作ができるAPIを作る
今回はGoを使う

# プロジェクト初期化
## CLIのインストール
CLI自体はnodeのものを使う(ので導入済みならスキップ)

“`bash
npm install -g aws-cdk
cdk –version
“`

バージョンが表示されればOK

## CDK Toolkitのデプロイ
初回のみCDKを利用する際に必要となるファイル群のデプロイが必要
→これもやったことがあるならスキップ

“`bash
cdk bootstrap aws://${ACCOUNT}/${REGION}
“`

以下のように表示されればOK

“`bash
✅ Environment aws://${ACCOUNT}/${REGION} bootstrapped.
“`

※異なるアカウント、リージョンでCDKを利用する場合はまたこの作業が必要になる

#

元記事を表示

Go言語でyesコマンド

# Go lang始めてみた
[A Tour of Go](https://go.dev/tour/welcome/)のConcurrency以外を読み終えた。
ここまでの内容をまとめるのにちょうど良さそうなのでyesコマンドを実装してみた。

# 仕様
– 1つ目のコマンドライン引数が”-h”または”–help”ならばヘルプメッセージを表示
– コマンドライン引数がなければ”y”をひたすら出力
– その他の場合はコマンドライン引数を” “でjoinした文字列をひたすら表示
– ~~最適化を頑張らない~~

# コード
https://github.com/NI57721/go-scripts
“`go:yes.go
package main

import (
“fmt”
“io”
“os”
“strings”
)

type yesReader struct{
yes string
reader io.Reader
}

func (r *yesReader) Read(b []byte) (int, error) {
n, err := r.rea

元記事を表示

【#43 エンジニア転職学習】GinTutorialのWebApp改造 PUT/DELETE

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

7月いっぱいまでGoのフレームワークであるGinについて、
学習をしていきます。

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

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

# 本日の学習内容
GinのTutorialで作成したAPIを改造して、簡素なWebアプリを作成しようと思います。
本日はAPIにメソッドを追加しました。

* **PUT/DELETEメソッド追加 ←Topics!!**

# PUT/DELETEメソッド追加
GinのtutorialではGETとPOSTのみ実装だったので、
先日挙げたタスク通り、まずはPUTとDELETEメソッドを追加実装します。

##### 追加する機能等
* **APIのPUTとDELETE**
* albumデータのDB管理
* ブラウザ上での表示(HTMLから)
* キーワード一致のG

元記事を表示

go のコンパイラが死んだ (go 1.18.4)

# これは何?

go のコンパイラが死んだので報告。

# 殺す方法

以下のコードをコンパイルすると死ぬ。

“`go:go1.18
package main

import “log”

type Obj interface{ Hoge() string }
type objType struct{}

func Send[T Obj](obj T) {
func() { obj.Hoge() }()
}

func foo(o Obj) { Send(o) }

func (o *objType) Hoge() string {
log.Println(“objType.Hoge”)
return “objType.Hoge”
}

func main() { foo(&objType{}) }
“`

実行結果はこう

“`
$ go1.18.1 run main.go
2022/07/30 20:12:04 objType.Hoge
$ go1.18.2 run main.go
2022/07/30 20:12:07 objType.Hoge
$ go1.1

元記事を表示

「A Tour of Go」 の Exercise: Maps を解きました

引き続きGo公式のチュートリアル「[A Tour of Go](https://go-tour-jp.appspot.com/list)」を読み進めています。その中に練習問題がいくつか用意されています。当記事は、Mapに関する練習問題「[Exercise: Maps](https://go-tour-jp.appspot.com/moretypes/23)」を解いた記録です。

## コード
“`go
package main

import (
“golang.org/x/tour/wc”
)

func WordCount(s string) map[string]int {
ret := make(map[string]int)
left := 0
for i, val := range s {
// 空白を見つけてsの left ~ i-1番目まで(i番目は空白) の単語の値をインクリメントして
// leftを更新する。leftの更新時に+1 しているのは空白をスキップするため
if ‘ ‘ == val {
ret[s[left:i]]++

元記事を表示

「A Tour of Go」 の Exercise: Slices を解きました

引き続きGo公式のチュートリアル「[A Tour of Go](https://go-tour-jp.appspot.com/list)」を読み進めています。その中に練習問題がいくつか用意されています。当記事は、Sliceに関する練習問題「[Exercise: Slices](https://go-tour-jp.appspot.com/moretypes/18)」を解いた記録です。

# コード
“`go
package main

import “golang.org/x/tour/pic”

func Pic(dx, dy int) [][]uint8 {
ret := make([][]uint8, dy)
for i := 0; i < dy; i++ { ret[i] = make([]uint8, dx) for j := 0; j < dx; j++ { // 式によって表示される画像が変わる ret[i][j] = uint8(i^j) // ret[i][j] = uint8((i^2) * (j^

元記事を表示

「A Tour of Go」 の Exercise: Loops and Functions を解きました

GCが標準で備わっていてかつ高速な言語を使えるようになりたいと思い、Goに入門。公式のチュートリアル「[A Tour of Go](https://go-tour-jp.appspot.com/list)」を読み進めています。その中に練習問題がいくつか用意されています。当記事は、関数に関する練習問題「[Exercise: Loops and Functions](https://go-tour-jp.appspot.com/flowcontrol/8)」を解いた記録です。

# コード
“`go
package main

import (
“fmt”
)

func Sqrt(x float64) float64 {
z := 1.0
for i := 0; i < 10; i++ { z -= (z*z - x) / (2 * z) } return z } func main() { fmt.Println(Sqrt(2)) } ``` # 解説 ## コード 用意された関数を任意回ループするだけなので簡単です。このアルゴリズムはA Tour of Go で

元記事を表示

Go言語の初学者が go mod を使って自分で作ったローカルのモジュールを引っ張ってこれるようにするまで【Go Modules】

新参者なので Go言語 を使ってモジュールを切り出す手法として $GOPATH を設定する方法と Go Modules(go mod コマンド) を使用する方法とで混乱してしまったのですが Go Modules の方が新しく2019年度の公式サイトのモジュール解説ページでも使用されており、これからの主流になりそうなのでこちらを使うことに。

公式チュートリアルだけではあまり理解できてる気がしなかったので記事にしました。
公式チュートリアルもおすすめですが自分でディレクトリを切って作ったモジュールを import したい人がすぐに把握できるようにまとめています。

参考:Understanding go.mod and go.sum – https://faun.pub/understanding-go-mod-and-go-sum-5fd7ec9bcc34
参考:Go Modules Reference – https://go.dev/ref/mod#go-mod-file

## go.mod とは何か ~前提の知識~
現ディレクトリの goファイル上 におけるモジュールの依存関係

元記事を表示

[翻訳]チュートリアル: GoとGinによるRESTfulなAPI開発(原文: Tutorial: Developing a RESTFul API with Go and Gin)

## この記事について

この記事はTutorial: Developing a RESTful API with Go and Ginを翻訳したものになります(2022/07/29最終更新)。ソースコード以外は意訳が含まれている可能性があるので、気になる箇所は[原文](https://go.dev/doc/tutorial/web-service-gin)をご参照ください。

## 目次
– 準備
– APIのエンドポイントの設計
– コードのフォルダを作成
– データの作成
– すべてのアイテムを返すハンドラーを書く
– 新しいアイテムを追加するハンドラを書く
– 特定のアイテムを返すハンドラを書く
– 総括
– 完成したコード

このチュートリアルでは、Go言語と[WebフレームワークGin](https://gin-gonic.com/docs/)(以降Gin)によるRESTFulなwebサービスのAPIを書くための基本を紹介します。

もしGo言語とそのツールに慣れているなら、このチュートリアルから多くのことを得られるでしょう。
もしあなたがGOを触るのが初めてということで

元記事を表示

GoでTopicごとにPubsubするWebsocket

# はじめに
こんにちは
クェスタ株式会社エンジニアの下澤です。

毎秒定期的に送られてくるデータをリアルタイム表示する開発があり、“`AppSync“`を検討していたのですが、コストがかかるため、Websocketで代用しました。

PubsubをGolangで実装してみたので、簡単にシェアします

# 環境
“`Golang“`と“`gorilla/websocket“`, “`echo“`を使います。
“`shell
go version go1.16.5 darwin/amd64
github.com/gorilla/websocket v1.5.0
github.com/labstack/echo
“`

# Github
https://github.com/lil-shimon/lil-pubsub

# 環境構築編

適当にファイルを作成し、Go環境の準備
“`shell
mkdir lil-pubsub && cd lil-pubsub
go mod init # e.g. go mod in

元記事を表示

Go+API Gateway+Lambda+DynamoDBでサーバレスなAPI

# はじめに

こちらの記事はGoとAPI Gateway + Lambda + DynamoDBでサーバレスなAPIを作る記事となっています。
前回の記事の続きとなっているため、一部手順を省略しています。

https://qiita.com/tkhs1121/items/b1e332acdbc50fad8c45

https://qiita.com/tkhs1121/items/18d8ba86f1afdec13381

# 環境
MacBook Air M1
開発言語 Go

# 手順
## Lambda関数の作成

一から作成のままランタイムを`Go.1.x` アーキテクチャを`x86_64`にして関数の作成をします。
![Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391445/e76764b3-3f67-c9c6-092f-efcfdf99e889.png)

### 必要なパッケージのインストール
“`
go get -u github.com/aws/aws-sdk-

元記事を表示

【#42 エンジニア転職学習】GinTutorialのWebApp改造

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

7月いっぱいまでGoのフレームワークであるGinについて、
学習をしていきます。

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

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

# 本日の学習内容
GinのTutorialで作成したAPIを改造して、簡素なWebアプリを作成しようと思います。
本日はそのための機能・仕様策定、API・タスク整理をしました。

* **アプリ開発タスク整理等 ←Topics!!**

# アプリ開発タスク整理等
先述のとおり、Ginのtutorialで作成したalbum APIに機能追加・DB連携等して簡素なWebアプリを作成します。
本日はタスク整理でほとんど終了しましたので、明日より設定したタスクを1つずつ切り分けて実施していきます。

##### 追加する機能等
* APIのPUTとDELETE
* al

元記事を表示

Goのコードの詳細情報を表示してくれるVSCodeのInlay hints機能を使いやすくカスタマイズする

## 背景
2022年7月に実施されたVSCodeのGo拡張機能のアップデートにて、Goのコード詳細情報を表示してくれる`Inlay hints`機能が導入されました。

https://github.com/golang/vscode-go/releases/tag/v0.35.0

関数やメソッドの引数・返り値の型やiotaで定義された定数の値を、実行せずともエディタ上に表示してくれるという機能です。

元々Language serverの`gopls`に先行して入っており、`Go Nightly`での早期リリースを経て本格導入されました。試すには、[設定] -> [Go > Inlay Hints]でそれぞれの機能を有効化します。
![スクリーンショット 2022-07-28 17.47.17.png](https://qiita-image-

元記事を表示

log.Logger & io.MultiWriter example

# Overview
How to use log.Logger with io.MultiWriter.
In case of writting STDOUT and File

# Example
“`
package main

import (
“io”
“log”
“os”
)

func main() {
logFile, _ := os.Create(“log.txt”)
defer logFile.Close()

mw := io.MultiWriter(os.Stdout, logFile)
logger := log.New(mw, “prefix “, log.LstdFlags)

logger.Println(“test”)
}

“`

元記事を表示

Goの学習方法

## はじめに
私が行ったGoの学習方法をまとめます。

## 記事を書いてる人の経験
[自己紹介](https://qiita.com/bear05/items/9bc49f01def7305fa075)

## 学習方法
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)

2.学習する
 様々な学習サイトがありましたが、私は公式のリファレンス「A Tour of Go」を一通り学習しました。
 様々な学習サイトをすべて網羅するとキリがないため、
基本だ

元記事を表示

Go パッケージグローバル変数が何故アンスコで宣言されていたか?

[gin/render.go at master · gin-gonic/gin · GitHub](https://github.com/gin-gonic/gin/blob/master/render/render.go)

[Goのアンダースコアはどんな意味なのでしょうか?](https://teratail.com/questions/58180)

render パッケージでアンスコを変数名にして変数を宣言しているが目的がわからなかったので調べた。

結論としては型名をRenderインターフェースとして宣言することによって代入している構造体は常にRenderインターフェースを実装していることを伝える目的で書かれている。(javaのimplみたい明示できないので)

元記事を表示

【#41 エンジニア転職学習】HTTP POSTメソッド作成時の動作確認エラー

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

7月いっぱいまでGoのフレームワークであるGinについて、
学習をしていきます。

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

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

# 本日の学習内容
GinのTutorialとして簡単なRESTfulAPI作成の学習をしました。

* **POSTメソッド作成 動作確認時のエラー ←Topics!!**
* 特定のアイテムを返すGETメソッド作成

# POSTメソッド作成時の動作確認エラー
本日もGinのAPI作成チュートリアルを進めていたのですが、
その中でターミナルでの`curl`コマンドを使用した
POSTリクエストの動作確認時にエラーが発生して、解決に手間取りましたのでまとめます。

#### 解決策
header情報内の`”`の前に`\`を入れてエスケープさせる
#### 原因
Wi

元記事を表示

ISUCON12 初参加エントリ

# 概要
ISUCON12予選に初参加しました!
ISUCONという大会自体は2年ほど前から知っていたのですが、
参加チームの上限が決まっていることもあり、あまり技術力が高くない自分が出てもいいのかと今まで尻込みしていました。
今年も見送りかなーと考えていたのですが、[ISUCON本](https://gihyo.jp/book/2022/978-4-297-12846-3)を読んだことでチューニングの基礎を勉強でき、参加しようと決心できました。ISUCON参加したいなぁでもチューニングの知識ないしなぁという方におすすめです!!

「ブログを書くまでがISUCONです!」とのことなので、当日のタイムラインと、予選までに勉強した内容についてまとめます。
チーム名「焼肉食いたい」でソロ出場し、最終スコアは5015でした。Goで実装しています。

# タイムライン
9:00 起床
9:40 ISUCONのかっこいいOPを見る。テンションが上がったが、共有できるチームメイトがおらず急に寂しくなる。来年はチームで参加することを決意。
10:00 競技開始
10:00~11:30 EC2構築して

元記事を表示

【#40 エンジニア転職学習】Go GinTutorial

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

7月いっぱいまでGoのフレームワークであるGinについて、
学習をしていきます。

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

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

# 本日の学習内容
GinのTutorialとして簡単なRESTfulAPI作成の学習をしました。

* APIエンドポイント(URI)の設計
* json含めたStructの作成
* **全アイテムに対するGET作成 ←Topics!!**

# 全アイテムに対するGET作成
必要な要素は2点で、
1. Responseを準備するHandler部分のコード
1. RequestパスをHandlerにマッピングコード

それぞれの機能部分を以下の関数で作成
1. `*gin.Context.IndentedJSON`でhttpステータスコードとstructをJSONに

元記事を表示

Golang + Ginのテスト内でセッションを保存する方法

## TL; DR
Golang + Ginを使ったリクエストのテスト中でセッションを保存する方法に多少苦戦したので紹介

## 結論

“`go
import (
“net/http/httptest”

“github.com/gin-gonic/gin”
“github.com/gorilla/sessions”
)

func SaveSession(recorder *httptest.ResponseRecorder, context *gin.Context, key string, value interface{}) {
var store = sessions.NewCookieStore([]byte(“secret”))
session, _ := store.Get(context.Request, “session”)
session.Values[key] = value
session.Save(context.Request, recorder)
}
“`

使い方

“`go
import (
“net/http”
“net/

元記事を表示

OTHERカテゴリの最新記事