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

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

【Go言語】JSONファイルからデータを読み込む

【初投稿】
投稿者は初めてQiitaに記事を投稿ですので,読みづらい箇所もあるかもしれませんが、どうぞご容赦いただけますと幸いです。

【記事について】
この記事は投稿者が学んだ技術について記述しております.中には誤っている部分もあるかもしれませんが、どうぞご容赦ください.

# はじめに
この記事では,Go言語におけるJSONファイルの読み込み方法について紹介させていただきます.

# 環境
macOS Monterey (バージョン 12.6.7)
go version go1.20.3 darwin/arm64

# JSONファイルとは?
JavaScript Object Notation(JSON、ジェイソン)はデータ記述言語の1つである.軽量なテキストベースのデータ交換用フォーマットでありプログラミング言語を問わず利用できる.名称と構文はJavaScriptにおけるオブジェクトの表記法に由来する.
([wikipedia](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation#cite_note-1 “Wikip

元記事を表示

Go言語の配列操作の使い難さを改善する

※こちらは,会社の技術ブログとのクロスポスト記事です.元の記事は[こちら](https://www.timedia.co.jp/tech/20230615-tech)

配列操作はプログラムの基本的な機能の一つですが,Go言語は他言語と比較してこの操作が使い難いと感じています.
この記事では,Go言語の配列操作の使い難さを改善した話をします.

# 問題
この記事では,3種類の基本的な配列操作を取り上げます.
* 配列末尾の要素を取得する
* 配列末尾に要素を追加する
* 配列のi番目の要素を削除する

C++, Python, MATLABでの操作を紹介し,その後Go言語ではどのような操作になるか解説します.
そして,Go言語の配列操作の使い難さを改善する方法を紹介します.

# C++
C++の配列操作プログラムと出力は,以下の通りです.
“`c++:main.cpp
#include
#include
using namespace std;

int main()
{
vector nums = {0,1,2,3,4}

元記事を表示

Golang×クリーンアーキテクチャのRest APIでテストを書こう

## 概要

– Golangで書いた簡単なRest API のテストコードを書いてみた記事です。

## 構成

– handler
– HTTPリクエストを処理するハンドラー関数。
– usecase
– ビジネスロジック、各種操作の実行、ハンドラーとリポジトリの橋渡し。
– repository
– DBと接続し、CRUD操作を実施。

ディレクトリ構成(抜粋)

詳細

– 微妙なところはあるかもです。utilとかの置き場所は今考えると微妙です( `internal` のほうが良いかも)。

“`bash
.
├── go.mod
├── go.sum
├── internal #外部に公開しない、プロジェクト内のみで使うロジック。リポジトリの実装もここ。
│ ├── config
│ └── repositories #リポジトリ層(DB操作)
│ ├── fixtures
│ │ └── stocks.yaml
│ ├── s

元記事を表示

[goquic]QUICリバースプロキシを試してみたが上手くいかなかった

## この記事は

[QUIC (Wikipedia)](https://ja.wikipedia.org/wiki/QUIC)によると

>quic-reverse-proxyと呼ばれるDockerイメージが存在し、これは、QUICのリクエストを、オリジンサーバーが理解できる単純なHTTPリクエストに変換するリバースプロキシサーバーとして動作する。

なるものが存在するらしい。
そのDockerイメージがコチラ→[devsisters/quic-reverse-proxy
](https://hub.docker.com/r/devsisters/quic-reverse-proxy/)

このDockerイメージを使って、QUICのリバースプロキシを試してみた

結果として、このリバースプロキシをHTTP/3,QUICで動作させることができなかった
その経緯を書き残し、モチベーションが戻れば、このセーブポイントからやり直したい

## サーバ証明書と鍵の作成

HTTP/3はTLS1.3を前提としている
HTTPS通信するために、[サーバ証明書と鍵の作成](https://www.

元記事を表示

Go言語プログラムの資料を自動生成する

※こちらは,会社の技術ブログとのクロスポスト記事です.元の記事は[こちら](https://www.timedia.co.jp/tech/20230606-tech)

業務でプログラムのドキュメント資料が必要になることがあります.
面倒な資料作成は,なるべく効率的に終わらわせたいですよね.
この記事では,Go言語プログラムの資料を自動生成する方法を紹介します.

# 前提
今回は例として,[Gin](https://github.com/golang-standards/project-layout)というウェブフレームワークの資料を自動生成したいと思います.
目標は,`docs`ディレクトリに資料を用意することです.最初に環境を用意します.

“`bash:Bash
$ git clone https://github.com/gin-gonic/gin.git
$ go install github.com/gin-gonic/gin@latest
$ cd gin/
$ echo */ # ディレクトリ確認
binding/ docs/ examples/ ginS/ int

元記事を表示

【Go】公式チュートリアルのAccessing a relational databaseでpanic: runtime error: invalid memory address or nil pointer dereferenceエラーが出た

# 背景
golang公式チュートリアルの[Accessing a relational database](https://go.dev/doc/tutorial/database-access)をやっていたところ、DB接続は行えているにも関わらず、SQLクエリーを叩く行でエラーが出ました。
備忘録として、そのエラーに対する解決策を残したいと思います。

# 発生したエラー
albumsByArtist関数でSQLクエリーを実行する行で以下のエラーが出ました。

“`golang
rows, err := db.Query(“SELECT * FROM album WHERE artist = ?”, name)
// => panic: runtime error: invalid memory address or nil pointer dereference
““

このエラーをググったところ、いわゆる**ぬるぽ**と呼ばれるエラーでした。
> ぬるぽとは、Javaで発生するエラーメッセージ「NullPointerException」の略称です。
nil値の参照型変数を

元記事を表示

Go で New Relic を試してみた

作成:2023年7月30日
お試しで New Relic を触ってみました。

# ライセンスキーの確認

[このリンク先](https://docs.newrelic.com/jp/docs/apm/agents/go-agent/installation/install-new-relic-go/#get-new-relic)にあるリンク「[アカウントのライセンスキー](https://one.newrelic.com/api-keys)」でライセンスキーを確認します。

# エージェントのインストール

import するためにインストールします。
“`:MacBook Terminal
go get github.com/newrelic/go-agent/v3/newrelic
“`

# main.go を作

元記事を表示

func (u *User) GetTodosByUser() (todos []Todo, err error) {} スキャンとは

“`
// GetTodosByUser は特定のユーザーに関連するTodoリストを取得します。
func (u *User) GetTodosByUser() (todos []Todo, err error) {
// SQLコマンドを定義します。?はプレースホルダーで、後で実際の値に置き換えます。
cmd := `select id, content, user_id, created_at from todos where user_id = ?`

// データベースから結果セットを取得します。
rows, err := Db.Query(cmd, u.ID)
if err != nil {
// エラーが発生した場合はログに記録して、エラーを返します。
log.Fatalln(err)
return nil, err
}
defer rows.Close()

// 結果セットからTodoを取得します。
for rows.Next() {
// 新しいTodoオブジェクトを作成します。
var todo Todo

// 現在の行

元記事を表示

【Go】デコード、エンコードの実装例(marshal、unmarshal)

# はじめに
GoでAPIを作成する際などに、marshal、unmarshalがよく登場するので、使用例を簡単にまとめておきます。

# 使用例
“`go:main.go
package main

import (
“encoding/json”
“fmt”
)

// structの定義
type Person struct {
Name string `json:”name”`
Age int `json:”age”`
Email string `json:”email”`
}

func main() {
// エンコードするデータ(Person型の変数)
person := Person{
Name: “John”,
Age: 25,
Email: “john@example.com”,
}

// データをJSON形式にエンコード(marshal)
jsonData, err := json.Marshal(person)
if err != nil {
fmt.Println(“Error encoding JS

元記事を表示

【Go】簡単なGetAPIの作成

# 実装
“`go:main.go
package main

import (
“encoding/json”
“fmt”
“net/http”
)

// データの構造体 (仮のデータ)
type Data struct {
ID int `json:”id”`
Name string `json:”name”`
}

func main() {
// APIエンドポイントのハンドラを登録
http.HandleFunc(“/api/data”, getData)

// サーバーを起動 (ポート: 8080)
fmt.Println(“サーバーを起動します…”)
go func() {
err := http.ListenAndServe(“:8080”, nil)
if err != nil {
fmt.Println(“サーバーの起動に失敗しました:”, err)
}
}()
fmt.Println(“サーバーは起動しています。”)

// サーバーが起動している間、メインの処理をブロックする
select {}

元記事を表示

Go言語で外部APIを呼び出しとJSONの取り扱いについて

# はじめに

今日はGo言語を用いて外部APIを呼び出し、その結果をJSON形式で取り扱う方法について記載します。
これはWebサービスを開発する際によく用いられる技術で、非常に役立つスキルです。

# 必要なパッケージのインストール

まずはじめに、`net/http`と`encoding/json`という2つのパッケージが必要となります。これらはGo言語の標準ライブラリに含まれているので、追加でインストールする必要はありません。

# 外部APIの呼び出し

まず、`net/http`パッケージを使って外部APIを呼び出します。`http.Get`関数を使うと、HTTPのGETリクエストを送ることができます。

以下に簡単な例を示します。

“`go
package main

import (
“fmt”
“net/http”
)

func main() {
// http.Getを用いて外部APIを呼び出す
resp, err := http.Get(“https://api.example.com/data”)
// エラーハンドリング
if err !=

元記事を表示

Next.js+Goでキャリアの意思決定を投稿できるサービスをつくりました

# つくったもの
キャリアの意思決定があつまるサービス「Wellbi(ウェルビ)」をつくりました。
意思決定、入社・退職エントリ、ジョブチェンジ、転職体験談などキャリアに関するものならなんでも投稿できます。よかったら投稿してみてください〜〜>< https://wellbi.vercel.app # かかった期間 5ヶ月。 (企画〜デザイン〜開発〜リリース) # つくってみてどうだった? スポットでエンジニア友達に手伝ってもらったりはしたものの、ベース1人でサービスをつくりきるのは結構大変でした(もはや手伝ってもらった時点で個人開発ではないのかもしれない...)。つけたい機能があったり、UIをリッチにしたいなあと思ったりすることが多々ありますが、持ってるアセット・リソースとの相談なのでミニマムでリリースできるようにすることを心がけました。 # どこが大変だった? フロント・バックエンドを1人で開発していくと自分の足りない技術が見えてくるので、そこのキャッチアップが大変でした。大変ですが「どうやって実装しよう?」と考え、自身の技術力と相談して形にしていくのは実際やってみると結構楽

元記事を表示

【Go】ログイン機能でウェブアプリを作ってみる(5)

こんにちは。

Part 5は仮登録 /auth/register/initial (1)の解説についてです。

# 目標
– ユーザーの仮登録を実装する

今回から仮登録処理を行なっていきます。

## 全体の流れの確認

– 仮登録 /auth/register/initial
– クライアントからemail, passwordを受け取る
– email宛に本人確認トークンを送信する
– 本登録 /auth/register/complete
– クライアントからemailと本人確認トークンを受け取る
– ユーザーの本登録を行う
– ログイン /auth/login
– クライアントからemail, passwordを受け取る
– 認証トークンとしてJWTを返す
– ユーザー情報の取得 /restricted/user/me
– クライアントからJWTを受け取る
– ユーザー情報を返す

こんな感じでした。

では、仮登録にはどんな機能が必要になるでしょうか。

## 必要な機能を考えよう!

箇条書きしてみます。

元記事を表示

Go言語で SQL query に(可変長な)複数のパラメータを渡したい

# 初めに
Go言語においてSQLのqueryに(可変長な)複数のパラメータの渡したかったのですが、いい記事が見つからなかったのでまとめてみました!同じことで困っている人の一助になれれば幸いです!!

# 環境
Hard: **Inter Mac**
OS: **Monterey 12.0.1**
Golang: **go version go1.20.5 darwin/amd64**

# 事前に知っていたこと
Go言語ではsymbol(手元の環境では ‘?’ )を SQL query に指定することで変数を受け取り可能です。
一つの例を示します。

“`ex1.go
rows, _ := db.Query(“SELECT * FROM テーブル名 WHERE address LIKE ‘%?'”,変数)
“`
([参考資料](https://graff-it-i.com/2021/06/24/golang-mysql-like/)より引用)

# やりたいこと
上記の query で指定している**変数**が状況に応じて要素数が変化するような**配列データ**だった場合に、Go

元記事を表示

Go+Echo+GORM(mysql)+DockerでSession,JWT付きログインWebアプリ

# はじめに

 どうも、Shakkuです。
 都内某高専情報科の3年生です。(2023/7/27時点)
 Go言語をお勉強し始めてから何ヶ月か経過したある日、そろそろちゃんとしたものを作ってアウトプットしたいなーと思ったので、作成,投稿してみました。
 作成したものは、GitHubにもあげています。(https://github.com/Shakkuuu/echo-login-app)

 どんなコードかだけ見たい方は上のGitHubを、ざっくりとした構成や使用技術の概要も見たい方は、下の「概要」「構成」を、コードの中身の説明も見たい方は、最後まで読んでいただければと思います。

# 概要

 Signup、Login、ログイン後のメモ登録機能があるWebアプリ。
 メモには、作成したユーザーのユーザーIDが紐づけられているため、そのユーザーだけに表示され、ユーザーが削除されると連動してそのユーザーが作成したメモも削除される。

 Docker、DockerComposeを使用して、バックエンド・API・DBのサーバーを同一ネットワークでたてている。

 フロントエンド?をHTML、

元記事を表示

GoでリクエストのJSONの一部をソートしたりエンコードしたり

# 概要
Goがまだ扱い慣れてないので、色々触ってみようということで色々触ってみました?
リクエストボディの一部をソートしてからBase64でエンコードしてみただけですが、色々ということにしといてください。

# 準備
要件的な何かを準備して、どういう思考プロセスで進めたか残しておきます。

– ユーザーは名前と年齢とタスクを持つ
– ユーザーはタスクを複数持つ
– タスクはタイトルと締切を持つ
– タスクは締切の昇順でソートする
– リクエストはユーザー情報にユーザーが持つタスクを含んだJSON形式(`application/json`)で送る(例:`example.json`)
– ソートした内容のJSONをBase64でエンコードする

“`json:example.json
{
“name”: “taro”,
“age”: 20,
“tasks”: [
{
“task”: “task2”,
“deadline”: “2023/01/31”
},
{
“task”: “task1”,
“dea

元記事を表示

Go言語でHTTPSサーバーを作成する

## はじめに

Go言語はシンプルさと効率性を重視して設計されており、その強力な標準ライブラリのおかげで、HTTP/HTTPSサーバーを短時間で立ち上げることができます。
今回は、Goの `net/http` パッケージを使って、HTTPSサーバーを作成します。

## 必要なもの

– Go言語の開発環境
– SSL/TLS証明書と秘密鍵

SSL/TLS証明書は、通信の安全性を保証するためにHTTPS接続で必要となります。証明書は信頼された認証局から購入することも、自己署名証明書を作成することも可能です。今回は、証明書と鍵のファイル名をそれぞれ `cert.pem` と `key.pem` とします。

## コード

以下が、基本的なHTTPSサーバーのコードです。

“`go
// mainパッケージを宣言します
package main

// 必要なパッケージをインポートします
import (
“fmt”
“log”
“net/http”
)

// handler関数はHTTPリクエストを処理し、”Hello, HTTPS!”というレスポンスを返します
fun

元記事を表示

【Go入門】Ubuntuでの環境構築から基礎まで【備忘録】

# はじめに

この記事はGoについて何も知らなかった時の自分へ向けた備忘録です。

まずはGoの環境構築を行い、最小限のGoプログラムの実行からエラー制御、構造体などについてをまとめています。

## 環境

– Ubuntu 22.04.2 LTS
– go version go1.20.5 linux/amd64

# Go環境構築

## Goのインストール

以下はUbuntu環境の場合の手順です。その他のプラットフォームをお使いの場合は、[Download and install – The Go Programming Language](https://go.dev/doc/install)でインストール手順を確認し、[All releases – The Go Programming Language](https://go.dev/dl/)から必要なファイルをダウンロードしてください。

“`bash
$ rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.5.linux-amd64.tar.gz
“`

元記事を表示

defer文の中でエラーハンドリングするときにエラーを握りつぶさないようにする

このミスを2回やらかしたので備忘録として書いておきます。

# やらかしたコード
– defer文の中で何らかの処理を行いたい。そこでエラーが発生したら、それをもちろんハンドリングしたい。その際に、以下のように書くと元々存在していたエラーを上書きしてしまう。

“`go
func hoge() error {
// 何らかの処理

defer func() {
err = cleanUp()
}

// 何らかの処理
return err
}
“`

# 修正例
例えば以下のようにすれば、元の関数で発生したエラーと、defer文内で発生したエラーを両方とも検知できる。

“`go
import (
“go.uber.org/multierr”
)

func hoge() error {
// 何らかの処理

defer func() {
err = multierr.Append(err, cleanUp())
}

// 何らかの処理
re

元記事を表示

【Go】ログイン機能でウェブアプリを作ってみる(4)

こんにちは。

Part 4はdocker-compose.ymlの解説についてです。

# 今回の目標
– docker-compose.ymlをなんとなく理解しよう!
– docker compose コマンドの使い方を覚えよう!

## なんでdockerを使うの?

前回 docker-compose.yml を作成し、MySQLコンテナを起動しました。しかし

なんでわざわざこんなことをするのでしょうか?

理由の一つとして 「ローカル(自分のPC)からの影響を排除したい」 と言うのがあります。
例えばコンテナを起動せずにもともとPCに入っているMySQLアプリを使ったとします。
自分のPCのMySQLは日本語対応が済んでいる、とします。
開発中は日本語でも問題ありません。すでに日本語対応したMySQLを使っているからです。
しかし、実際のサーバーにMySQLを入れる時に日本語対応ができておらず、アプリを実行するとエラー。
だったら「初めから」の状態のもの、実際のサーバーとできるだけ近いものを準備し、そこから始めた方が後々の問題を回避できます。

だから「自分のPCからの影響

元記事を表示

OTHERカテゴリの最新記事