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

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

【#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

元記事を表示

ISUCON 12 初参戦レポート

# 概要

言わずとしれたエンジニアの祭典, ISUCON に今回初参戦してきました!今まで全く関心が無かったのですが,友人に半ば無理やり誘われて…という流れで勢いで参加してしまいました :rolling_eyes:

https://isucon.net/archives/56571716.html

既に「要件把握時間かかる人間だからこういうの向いてないなぁ」という不安が頭によぎっていて,予選当日には実力不足を痛感することになってはしまったのですが,とても学びがあったので,来年のリベンジ(?)に生かすために振り返っておきたいと思います。

以下メンバーです。自分以外の 2 人はいずれも以前までの職場の知り合いです。

| メンバー | 主なロール |
|:—|:—|
| joe [@joe_yuzupi](https://twitter.com/joe_yuzupi) | インフラ |
| mpyw [@mpyw](https://twitter.com/mpyw) | バックエンド |
| chaba [@Tea_Server](https://twitter.com/

元記事を表示

Goにおけるパッケージのインポート方法いろいろ~ローカル環境のパッケージをインポートしたい~

Goでパッケージのインポート方法がいろいろあって混乱したので整理してみました。
下の図に対応している章を見れば、インポート方法が分かるようになっています。

![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/537a3924-4ac5-de1d-1937-608a2d9fcc0b.png)

**目次**
– [1. 標準pkgをインポート](#1-標準pkgをインポート)
– [2. 自モジュール内のpkgをインポート](#2-自モジュール内のpkgをインポート)
– [3. ネット上から取得したpkgをインポート](#3-ネット上から取得したpkgをインポート)
– [4. GOPATH配下のpkgをインポート](#4-gopath配下のpkgをインポート)
– [5. 任意のローカルフォルダ内のpkgをインポート](#5-任意のローカルフォルダ内のpkgをインポート)

:::note warn
基本的には`モジュールモード`を想定していますが、[4. GOPATH配下

元記事を表示

【#38 エンジニア転職学習】Go WebApp フロントエンド部分作成

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

使用しているGoのUdemy教材後半部分である、
Webアプリ作成演習を学習していきます。

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

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

# 本日の学習内容
本日はCandleStickのデータフレーム作成、APIHandler、jQueryを使用したフロントエンド部分作成を学習しました。

* データフレーム
* APIHandler
* **フロントエンドchart作成 ←Topics!!**

# フロントエンド chart作成
以下今回のフロントエンド部分作成時の個人的ポイントです。
* chart作成のHTMLは基本的なものは`developers.google.com/chart/`からテンプレート取得
* jQueryは「Google Hosted Libraries」よりリンク

元記事を表示

【自己学習】Go言語を学ぶ(6)

公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list

## For(繰り返し)

* 基本的に、 for ループはセミコロン ; で3つの部分に分かれています:

* 初期化ステートメント: 最初のイテレーション(繰り返し)の前に初期化が実行されます
* 条件式: イテレーション毎に評価されます
* 後処理ステートメント: イテレーション毎の最後に実行されます
* 初期化ステートメントは、短い変数宣言によく利用します。その変数は for ステートメントのスコープ内でのみ有効です。

ループは、条件式の評価が false となった場合にイテレーションを停止します。

サンプルコード:
1~9まで足していき合計値を出力
“`go
package main

import “fmt”

func main() {
sum := 0
for i := 0; i < 10; i++ { sum += i } fmt.Println(sum) } ``` 結果: 45 ## For continued

元記事を表示

GolangでAPIを作るレシピ集

# はじめに
最近業務でGolangを触ることが増えてきました。
「この実装前もやったな」とか「これどうやって書くんだっけ?」ということが増えてきたので、レシピっぽくまとめてみました。
何故こういう実装をするかという点よりも、こうやれば良いという実装の例を示す形にしています。
深く言及する記事はまた別途まとめたいと思います。

# DBと接続したい場合

“`go
/*
DB変数を用意しておいて、それを使いたいところでimportする。
importした段階でinitメソッドを走らせるという実装が多い。
DDDでやるならインフラ層に記述する。
*/

import (
“database/sql”
“fmt”
“os”

// mysqlのドライバーをimportする。
_ “github.com/go-sql-driver/mysql”
)

func init() {
// dsn(データソースネーム)を構築。環境変数で渡すならos.Getenvで渡す。
dsn := fmt.Sprintf(“%s:%s@tcp(db:3306)/%s?charset=utf8”,

元記事を表示

Go クロージャー(closure) の理解

A Tour of Go でクロージャーが出てきたのでまとめてみた。

“`go:sample.go
package main

import “fmt”

//クロージャー
func adder() func() int {
sum := 0
return func() int {
sum += 1
return sum
}
}

func main() {
a := adder()
for i := 0; i < 10; i++ { fmt.Println(a()) } } ``` 出力結果は以下の通り ``` 0 1 2 3 4 5 6 7 8 9 10 ``` 当時の自分: a()を10回実行しているのは理解できる。あれ...a()に代入しているadder()は ```go:closure.go //クロージャー func adder() func() int { sum := 0 return func() int { sum += 1 return sum } } ``` これだから、毎回 `sum := 0` で初期化されるのでは

元記事を表示

OTHERカテゴリの最新記事