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

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

[翻訳]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` で初期化されるのでは

元記事を表示

Next.js と Go で WebSocket 通信を行おう【接続編】

# はじめに
1. [Next.js と Go で WebSocket 通信を行おう【環境構築編】](https://qiita.com/1129-tame/items/39101ed81039542198dc)
1. [Next.js と Go で WebSocket 通信を行おう【接続編】](https://qiita.com/1129-tame/items/2036d89915b3a3d026be) <- 今回の記事 Next.js と Go を利用して WebSocket 通信を行なってみます。 環境構築は前回記事を参照してください。 今回は実際に WebSocket 接続を行い、ローカル環境で双方向通信を実現させます。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180763/9cedec58-9ea5-bf74-87b6-3e8bc055f1e8.png) このように form にデータを入力し、サーバーサイドでデータを加工して受け取ることをゴールとします。 h

元記事を表示

go1.18 は go1.17 よりはっきり遅いことがあるよ

#  これは何?

Twitter で軽率に

と書いたので、本当にそうなのかどうか調べてみたら驚くべき結果に!
となったので記事にしてみた。

とはいえ。
これはマイクロベンチマークに過ぎないので、全体的な性能とかではなく、そういう事がありうるとうだけのこと。

# 調べたこと

なんとなく、動的に定められる関数を呼び出すのがいいなと思って、こんなコードにしてみた。

あと、メモリ確保にもたくさん時間を使っている。

## go 版

“`go:go1.11etc
package main

import (
“fmt”
“os”
“runtime”
“strconv”
“time”
)

type proc = func(a uint32) uint32

func test(num uint32) uint32 {
m := make([]proc, 0, num)
for ix := uint32(0); ix < num; ix++ { i

元記事を表示

GoでAWSWAF WebACL一覧を取得するサンプル

## ポイント
– CloudFrontにアタッチしているWAFを利用する場合は、us-east-1リージョンを指定しないといけない

## サンプル

“`go
package main

import (
“fmt”
“os”

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

func main() {

sess := session.Must(session.NewSessionWithOptions(
session.Options{
Profile: os.Getenv(“AWS_PROFILE”),
SharedConfigState: session.SharedConfigEnable,
}))

svc := wafv2.New(sess, sess.Config.WithRegion(“us-east-1”))

para

元記事を表示

【#37 エンジニア転職学習】Go WebApp DB関連

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

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

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

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

# 本日の学習内容
本日はcandleスティック情報を作成・取得するmodelやcontroller部分を学習しました。

* DBスキーマ作成
* **candleDBに関するSQL文コード作成 ←Topics!!**

# CandleDBに関するSQL文コード
bitflyerから取得してくるCandleの情報(duraiton, open, close, high, low, volume 等)を入れておくDBテーブルのスキーマの作成。
また、テーブルの変更を行うSQL文コードの作成を中心に行いました。

以下本日のポイント
* 基本的なDbConn

元記事を表示

Azure Developer CLI (azd) をソースコードからビルドする

# Azure Developer CLI (azd) とは

Azure Developer CLI (azd) は、米国時間の2022年7月12日にオープンソースプロジェクトとしてパブリック プレビューで公開されました。

– [Introducing the Azure Developer CLI (azd): A faster way to build apps for the cloud – Azure SDK Blog](https://devblogs.microsoft.com/azure-sdk/introducing-the-azure-developer-cli-a-faster-way-to-build-apps-for-the-cloud/)

現在のところ、Azureのコンピューティング サービス上にAzure Cosmos BDにアクセスするWebアプリ(Python、JavaScript/TypeScript、C#)のテンプレートを作成できて、Azureへのデプロイまでを支援するCLI コマンドとなっており、今後はJavaやAKSのテンプレートも用意され

元記事を表示

OpenSSLでX.509証明書を作成してGoで署名検証するまでのメモ

# ステップ

– 1. ルート証明書/サーバ証明書の作成
– ① ルート証明書の作成
– ② 証明書署名要求の作成
– ③ サーバ証明書の発行
– ④ OpenSSLで署名検証
– 2. Goで署名検証

# 1. ルート証明書/サーバ証明書の作成

**① ルート証明書を作成します**

とりあえず有効期限は`-days 365000`として長くしています。
また、`-newkey rsa:4096 -keyout root.key`オプションを付けることで秘密鍵も同時に生成しています。
さらに`-subj “/CN=my root cert”`とすることで、インタラクティブに項目を入力しないようにしています。
(なのでコピペすると同じものが作られるはず….)

“`
openssl req -x509 -nodes -days 365000 -newkey rsa:4096 -keyout root.key -out root.pem -subj “/CN=my root cert”
“`

実行例
元記事を表示

olivereを使ってElastic Searchのネストした集計を実行する

# はじめに
Go言語のElastic Searchのクライアントを調べると、
– [elastic社公式クライアント](https://github.com/elastic/go-elasticsearch)
– [olivere](https://github.com/olivere/elastic)

の2つが候補になるかと思います。

今回は`olivere`クライアントを使った、
ネストした集約クエリの実装方法と実行結果の取得方法についてまとめます。

(補足) olivereクライアントは2022/07/23現在Elastic Search v8以降に対応していないので注意してください

### 実行環境
Go: `ver 1.18`
Elastic Search: `ver 7.17`
 
# サンプルIndex
サンプルとして以下ようなIndexを想定します
“`
POST users/_bulk
{ “index” : {} }
{ “name”: “user1”, “age”: 15, “created_at”: “2022-07-01” }
{ “index”

元記事を表示

【#36 エンジニア転職学習】Go WebApp API認証・作成

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

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

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

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

# 本日の学習内容
本日でGoでのAPI認証、作成までを一通り終了しました。

* **API認証・作成 ←Topics!!**

# API認証・作成
実際に講座で使用するビットコインAPIのコードを書きながら、APIの作成手順やポイント等を学習しました。
今時点では完全に理解できない部分もありましたが、**基本的な構文をそのまま使用したりする**ところもありました。ですので、ネットワーク関連の重要パッケージについて理解していれば、難なくコーディングできそうです。
#### ポイント
* 各APIのdocumentから、requestやresponseのフ

元記事を表示

GolangのPackageとModuleについて

GolangのPackageとModuleを使ってGoファイルを分けて関数定義する方法がわからなかったので、調べて実行してみた2022年7月時点の情報を記載します。

## Goファイルを作成
次の2つのファイルを作成します。
“`Go:test1.go
package main

import “fmt”

func main() {
fmt.Println(“test1”)
test2()
}
“`
“`Go:test2.go
package main

import “fmt”

func test2() {
fmt.Println(“test2”)
}
“`
## module作成と実行
“`
MacBook-Pro tmp20220722 % go mod init main
go: creating new go.mod: module main
go: to add module requirements and sums:
go mod tidy
MacBook-Pro tmp20220722 % ls
go.mod t

元記事を表示

StreamServer Interceptorでコンテキストを上書きしたい時

Interceptorで認証情報などの値をコンテキストに入れて使いたいときがあります。
Unary RPCだと、第一引数で受け取ったコンテキストをそのまま使えばいいですが、Stream RPCの場合は一工夫必要だったのでメモしておきます。

ContextとServerStreamをEmbedded fieldとして持つStructを定義して、それをhandlerに渡します。
実際のStreamの処理でContext()を呼び出せば、値を入れたコンテキストを取り出すことが出来ます。

“`go
func myStreamServerInterceptor(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
ctx := context.WithValue(ss.Context(), “key”, “value”)
return handler(srv, &serverStreamWrapper{
Serv

元記事を表示

go で private なメソッドは他パッケージでは実装できない

# これは何?

go で

“`go:go
type Foo interface {
private()
}
“`

みたいなインターフェイスがあって、この `private` を他パッケージで実装可能かどうか調べた。

# C++ の場合

C++ の場合。
アクセス制御とオーバーライド可否は直行している。

“`c++:c+++
struct base
{
private:
virtual void foo() = 0;
};

struct derived : public base
{
private:
virtual void foo() override {}
};
“`

private なメンバ関数をオーバーライドできる。

たまにそういうコードを見る。まれに便利。

# Go の場合

public なインターフェイスに private なメソッドを用意して。

“`go:foo/foo.go
package foo

type Foo interface {
private()
}
“`

それを別のパッケージで実装すると。

“`go:

元記事を表示

OTHERカテゴリの最新記事