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

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

「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/

元記事を表示

【Golang】C compiler “gcc” not foundエラーからの脱出

# 問題発生
VSCodeでGo言語勉強中に下記のように初めてSQLiteをインポートしようとしました。
“`
go get github.com/jinzhu/gorm
go get github.com/mattn/go-sqlite3
“`
“`Go:main.go
import (
//他のインポート
“github.com/jinzhu/gorm”
_ “github.com/mattn/go-sqlite3”
)
“`
そしていざ実行!
“`
go run main.go
“`
すると下記のエラーにぶち当たりました。
“`
exec: “gcc”: executable file not found in %PATH%
“`
ああ、SQLiteを使うにはgccというC言語コンパイラーが必要なんだな。
そこで[こちら](https://jmeubank.github.io/tdm-gcc/)の「MinGW-w64 based」からgccをインストール!
一応確認。
“`
gcc -v
“`
するとちゃんと反応あってインストールに成功し

元記事を表示

細かいつまずいたことをメモしておく(2022年7月編)

# DockerでGoのパッケージが読み込めない

`go.mod`を利用する必要がある
https://qiita.com/kazuma_M/items/75d522668d42247075f1

# VSCodeのGoの拡張機能でエラーがでる

VSCode+WSL2+Docker+Goの環境でGOの拡張機能をいれたところ、起動時にVSCodeの左下に以下のエラーがでるようになりました

“`
failed to find the “go” binary in either goroot()….
“`

これはローカルにGOをインストールすることで解決できました。

https://blog.nya-n.net/posts/post-1853/

https://qiita.com/sola-msr/items/93fbf9c988ee81a2f196

またインストールしたところ以下のエラーに変わりました

“`
the “gopls” command is not available. run “go install -v golang.org/x/tools/gop

元記事を表示

[翻訳]Go言語のWebアプリケーションの書き方(原文: Writing Web Applications)

## この記事について

この記事はGoでWebアプリを作るための公式チュートリアル「[Writing Web Applications](https://go.dev/doc/articles/wiki/)」の翻訳記事になります(2022/07/26最終更新)。

## 目次
– イントロダクション
– 始めよう
– データ構造
– `net/http`パッケージの紹介
– wikiのページを配信するために`net/http`を使用する
– ページの編集
– `html/template`パッケージ
– 存在しないページの扱い
– ページの保存
– エラーハンドリング
– テンプレートキャッシング
– バリデーション
– 関数リテラルとクロージャの紹介
– 試してみる
– 他の課題

## イントロダクション
このチュートリアルで扱っていること:
– loadとsaveメソッドを使ったデータ構造の作成
– webアプリケーションを構築するためのnet/httpパッケージの使用
– HTMLテンプレートを処理するためのhtml/templateパッケージの使用
– ユーザの入力を検証す

元記事を表示

【#39 エンジニア転職学習】Go Gin Tutorial開始

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

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

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

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

# 本日の学習内容
本日よりGinのTutorialを学習開始しました。

* **Gin Tutorial ←Topics!!**

# Gin Tutorial開始
昨日でUdemy教材でのGoを使用したWebアプリ作成を一通り終えました。
その中で**GoのWebフレームワークを学習したい**と思いました。理由は以下2点あります。
* 自分で1からあのレベルのコードを記述するのは難しいと感じた
* アプリ作成するための**ハードルを最初はとにかく低くしたい**と思った

どちらも同じように「自分の技術に対する理解不足」が根本原因ですが、インプットし続けるよりアウ

元記事を表示

Goのデバッグ環境をvscodeで構築

# 背景
Go言語の勉強をvscodeでしたく、いざデバッグモードを使ってやろうと思ったら謎のエラーがおきてなんでやねんっ!ってなったのでまとめました。ちなみにM1マック使ってます。

## 謎のエラーの内容
なんじゃこのやろう
“`
go: go.mod file not found in current directory or any parent directory; see ‘go help modules’ (exit status 1)
“`

# 解決策
調べてみたらgo.modっていうファイルがないのが原因だそうなので色々調べてみましたー。

### 手順1 
vscodeで`「コマンド」+「Shift」+「p」`と入力し、以下の画像の`Go:Install/Update Tools`をクリックする。
![スクリーンショット 2022-07-25 19.24.24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2038763/8e0b269a-7469-167b-1a27-9b81

元記事を表示

OTHERカテゴリの最新記事