Go関連のことを調べてみた

Go関連のことを調べてみた

Goの空の構造体

Goの特定のデータセットを扱える構造体で、A Tour of Goにも出てくる。

“`go
package main

import “fmt”

type Vertex struct {
X int
Y int
}

func main() {
fmt.Println(Vertex{1, 2})
}
“`

この例ではX, Yをintとして持つVertexという構造体を定義している。

そんな構造体のフィールドを持たない空の構造体を使うこともある。

空の構造体の特徴と使う例をまとめる。

## 空の構造体

空の構造体は以下のようなものである。

“`go
type emptyStruct struct{}

var emptyStructVar struct{}{}
“`

再度の説明にはなってしまうが、空の構造体はフィールドを持たない構造体である。

フィールドを持たないため使い道がないじゃん?と思うかもしれないが、メモリを消費しない。

通常の構造体はフィールドを持つためその分のメモリを確保するが、空の構造体はフィールドがないためメモリを消費

元記事を表示

【Go】環境毎の設定値運用戦略

# はじめに
こんにちは!mizukoです!
先日[PaPut](https://paput.io)という個人開発のサービスをβ版としてリリースしました!

その際、今後の個人開発ライフのために、基盤作りを行ったのですが、
環境毎の設定値運用の戦略も検討したので、アウトプットしていきたいと思います!

PaPutについてはぜひ[こちら](https://qiita.com/mizuko_dev/items/5335f93bb3c93f407796)をご覧いただけますと幸いです🤗

# 戦略
環境毎の設定値を運用するにあたり、以下方針で運用していきます。
– .envやtomlを使わず、環境変数を利用する
– ローカル開発では.envrcを使う
– 本番環境では、ホスティングサービスやIaaSで環境変数を扱えるサービスを選ぶ
– デプロイはGithubと連携し自動で行う

# ソースコード
“`go
package config

import (
“os”
“strconv”
)

type DatabaseConfig struct {
Host string
Na

元記事を表示

PythonまたはGoでDockerコンテナに立ち上げたMySQLサーバーと通信する方法

データベースを構築するにあたって,DockerコンテナでDBもアプリも動くといいですよね?ローカルで動かす際にdockerコンテナ内で処理が完結するのでシームレスに通信することができる.
本記事ではPythonまたはGoを用いてDockerコンテナ上のMySQLサーバーと通信する方法について記載する.
![スクリーンショット 2024-07-05 13.21.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/e36ccd6a-bc6c-5805-2adb-e506be6011b3.png)

今回は以下の知識はある前提で話をする
**SQLの文法**

https://qiita.com/tarakokko3233/items/f038fbaccdd92fb0308a

**Dockerの基本**

https://qiita.com/tarakokko3233/items/6f6d03bd6d1e69c9e67e

**仮想環境とDockerコンテナの違い**

https://qi

元記事を表示

【Go言語】echoを使って簡単なWebAPIを実装するハンズオン

# 1. はじめに
ひととおりechoの機能を確かめるために、簡単なWebAPIのアプリを試作して主要な機能は把握できました。
その過程でまとまったコードが書けたので、せっかくならとハンズオン形式で公開しようと思い、記事にしました。お役に立てれば幸いです。
問題点等ありましたら教えてください。

# 目次
– [1. はじめに](#1-はじめに)
– [2. フォルダ構成](#2-フォルダ構成)
– [3. HTTPメソッド](#3-httpメソッド)
– [3-1. 基本設定](#3-1-基本設定)
– [3-2. GetUser](#3-2-getuser)
– [3-3. PostUser](#3-3-postuser)
– [3-4. PatchUser](#3-4-patchuser)
– [3-5. DeleteUser](#3-5-deleteuser)
– [3-6. GetUers](#3-6-getusers)
– [4. プロダクトの全体像](#4-プロダクトの全体像)
– [5. 参考](#6-参考)

# 2.

元記事を表示

learn-go-with-tests Select

# Select
2つのURLを取得し、それらをHTTP GETでヒットして最初に返されたURLを返すことで「競合」するWebsiteRacerと呼ばれる関数を作成するように求められました。 10秒以内に戻らない場合は、「エラー(error)」を返します。

これには

– HTTP呼び出しを行うための net/http
– ゴルーチン
– プロセスを同期するためのselect

# 最初にテストを書く
“`go
func TestRacer(t *testing.T){
slowURL := “http://www.facebook.com”
fastURL := “http://www.quii.co.uk”

want := fastURL
got := Racer(slowURL, fastURL)

if got != want {
t.Errorf(“got %q, want %q”, got, want)
}
}
“`
テストを実行すると`./racer_test.go:14:9: undefined: Racer`で失敗します。

## テストを実行

元記事を表示

goでJWSの署名と検証をやってみる

# 概要
[golang-jwt](https://pkg.go.dev/github.com/golang-jwt/jwt/v5)でJWSの署名作成と検証をやってみた。

## コード
“`go
package main

import (
“crypto/ecdsa”
“crypto/elliptic”
“crypto/rand”
“crypto/rsa”
“time”

“github.com/golang-jwt/jwt/v5”
)

func main() {
// 署名アルゴリズムの設定
signKey, _ := rsa.GenerateKey(rand.Reader, 2048)
verifyKey := &(signKey.PublicKey)
method := jwt.SigningMethodRS256

// JWSの作成と署名
token := jwt.NewWithClaims(method,
jwt.MapClaims{

元記事を表示

GoでWebSocket通信をやってみる

## はじめに
クライアントとサーバーで双方向通信ができるWebSocket通信を、Goでやってみました。

## Goのコード

Go側では、gorilla/websocketパッケージを利用して、WebSocketの接続を待ち受けます。

接続を確立した後は、for文で永続的にコネクションを維持します。

サーバーからのプッシュ通信をゴールーチンを使って5秒ごとにクライアントに送信しています。

“`go
package main

import (
“log”
“net/http”
“time”

“github.com/gorilla/websocket”
)

var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
}

func echo(w http.ResponseWriter, r *http.Request) {
conn,

元記事を表示

【Go言語】golangci-lintの使い方

## はじめに

Goでは [golangci-lint](https://github.com/golangci/golangci-lint) というリンターに`gofmt`, `goimports`, `govet`など100以上のリンターが入っている。

https://golangci-lint.run

## インストール

### バイナリ

“`sh
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s — -b $(go env GOPATH)/bin v1.59.1
“`

### brew

“`sh
brew install golangci-lint
brew upgrade golangci-lint
“`

最新リリースがbrew似ない時は`brew tap`からインストールする。

“`sh
brew tap golangci/tap
brew install golangci/tap/golangci-lint

元記事を表示

brainf*ckのインタプリタを書いて高速化しよう

# なんだこれは

少し前に、Goのプログラムをチューニングして遊びたいなと思い、brainf*ckインタプリタを作って高速化しました。
忘れないうちにそのときのことを書いておこうという記事になります。
高速化!高速化!うおおおおお!

# できたもの

こちらが最終的に完成したものになります。
ベンチマークにはbfでマンデルブロ集合を描画するプログラムを利用しています。
それを私の手元のPCでインタプリタに食わせたときの実行時間を減らしていくという形で高速化を進めました。

始めた当初は描画に**42.36s**かかったところ、最終的には**2.271s**で描画できるようになりました。ついでにbfをllvm irにトランスパイル?するプログラムも書いていて、それを使ってコンパイルした場合は**0.466s**でマンデルブロ集合を描画することができます。

https://github.com/uchijo/bf-eval

# 皆さんもぜひ高速化を…

途中からは以下のようなルールを設け、友人らと速度を競いながら遊んでいました:

– https://github.com/pabl

元記事を表示

Shell作ってみる:Goバージョン

## 内容
– [この記事](https://blog.init-io.net/post/2018/07-01-go-unix-shell/#introduction)を参考に実施した
– Cの記事もあるので、今後そちらでも作成したいと思う

## 記事のコード(一部改変)
動かしたところ、EOFが無限に表示されてしまったため、一部変更した
また独自のコマンド`hello`を追加した
“`go:main.go
package main

import (
“bufio”
“errors”
“fmt”
“os”
“os/exec”
“strings”
)

// learn-memo: メイン関数。プログラムのエントリーポイントとなり、ユーザーの入力を無限ループで処理する
func main() {
fmt.Print(“Golang Shell\n”)
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print(“> “)
// learn-memo: キーボードからの入力を読み取る
input, err :

元記事を表示

Goのlog/slogパッケージを使ってみる

## はじめに
今まで、文字列などを出力するときはlogかfmtを使って標準出力か標準エラー出力をしていたが、APIサーバを作るにあたり利用者の行動をファイルに記録する必要があると考えた。そこで、Goの標準パッケージであるlog/slogを用いて、json形式での構造化ロギングを行った。

## 実装
### コード
このコードは、GoのWebフレームワークに一つであるginを用いた簡単なAPIサーバです。エンドポイントへのアクセスが行われたとき、その情報をlog/slogを用いてserver.logに出力します。

https://github.com/Sawawa42/slog-qiita

“`golang:main.go
package main

import (
“github.com/gin-gonic/gin”
“io”
“log”
“log/slog”
“os”
“time”
)

func main() {
// ファイルを開く
file, err := os.OpenFile(“server.log”, os.O_APPEND|os.O_CREA

元記事を表示

Generics: A Boon for Strongly Typed Languages

![Generics_typed_languages_36a2c0a02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778885/058d68b5-b803-9d93-c619-245a68166d0c.png)

> Exciting News! Our blog has a new **[home](https://canopas.com/blog)**!🚀

## Background

Consider a scenario, You have two glasses one with milk and the other with buttermilk. Your task is to identify between milk and buttermilk before drinking it(of course without tasting and touching!).

Hard to admit that, right? Just because they seem sim

元記事を表示

【個人開発】PaPut(パプト)を支える技術

# はじめに
こんにちは、mizukoです!
この度、エンジニアのためのインプット・アウトプットを加速させるサービス「[PaPut(パプト)](https://paput.io)」のβ版をリリースしました!
サービスについてはぜひ[こちら](https://qiita.com/mizuko_dev/items/5335f93bb3c93f407796)をご覧ください!

本記事では、PaPutを支える技術について記載していきたいと思います!

# 技術選定の軸
私が技術選定を行う際に軸にしているのは以下です。
– モダンか?
– 情報は多いか?
– 市場価値は高いか?
– 人材確保は容易か?

いくら素晴らしい技術でも、導入や保守が大変だと無駄なコストがかかってしまいます。
他人にも受け入れやすく、できるだけモダンで今後に繋がるような技術を選定するように心がけています。

# フロントエンド
## フレームワーク
フロントエンドには[Next.js](https://github.com/vercel/next.js)を使っています。
開発当初、丁度App Routerが登場したので、

元記事を表示

【個人開発】エンジニアのインプット・アウトプットを加速させるサービス「PaPut(パプト)」β版をリリースしました!🎉

# はじめに
こんにちは、mizukoです!
この度、エンジニアのためのインプット・アウトプットを加速させるサービス「[PaPut(パプト)](https://paput.io)」のβ版をリリースしました!
新サービスについて、宣伝も兼ねて色々とアウトプットしていきたいと思います!

# 自己紹介
改めて私が何者なのか、自己紹介させていただきます🙏

– 年齢
– 29歳
– 職歴
– 新卒1年間フリーの音楽奏者
– その間独学でプログラミングを勉強
– 勉強して作ったアプリを元にエンジニアへ転職
– 25歳でフリーランスへ

普段はGo、Typescript(Node、React、Next.js)、AWSを軸にフルスタックのフリーランスエンジニアとして活動しています。
お仕事依頼待ってます🫶

# どんなサービスか
PaPutは、「インとアウトをパパッとプット」をコンセプトに、
技術的なナレッジの投稿ハードルを極力下げ、「メモ」という単位で簡単に自分が学んだことをアウトプットでき、Xの様な感覚でメモを閲覧し、簡単にインプットできるサービ

元記事を表示

GolangのYamlパッケージのバグを見つけた話

## 初めに

弊社プロダクトでは設定に関する項目をyamlで記述していてAPI起動時にUnmarshalしているのですが、その結果が期待していたものと異なることが以前発生したので原因は何だったのか、どうやって突き止めたのかをまとめてみました。
とりあえず原因だけ知りたいという方は[こちら](https://github.com/go-yaml/yaml/issues/1035)のissueを見て頂くと良いかと思います。

## 使用環境
[yamlライブラリ](https://github.com/go-yaml/yaml)
“`bash
% go version
go version go1.21.1 darwin/amd64
“`

## バグの詳細
yaml上に書いた一部の設定が構造体に反映されませんでした。
具体的には次のようなyamlを用意した時に、 `merger_val` の値がマッピング先に反映されていませんでした。
“`config.yaml
mergee_param: &mergee
param_key:
keywords: []

merger

元記事を表示

Goのcontextを使ってみる

## WithCancel

WithCancel()でキャンセル用のcontextを作成しておき、2秒待ってから、cancel()を実行して処理を中止するように、longRunningTask()に伝えています。

こうすることで、それ以上実施する必要のない処理を止めることができるようになります。

“`go
package main

import (
“context”
“fmt”
“time”
)

// 長時間かかる処理をシミュレートする関数
func longRunningTask(ctx context.Context) {
select {
case <-time.After(5 * time.Second): // 処理が完了した場合 fmt.Println("Task completed") case <-ctx.Done(): // キャンセルやタイムアウトが発生した場合 fmt.Println("Task canceled:", ctx.Err()) } } func main() { // キャンセル可能なコンテキストを生成

元記事を表示

【Go言語】ジェネリクス

# はじめに

今回はGoのジェネリクスの使い方をまとめました。
スライドもあります。

# any

## anyとは

anyとは空インターフェイス`interface{}`のエイリアスで、どんな型でも保持することが可能。

以下は実際にanyにいろんな型を入れてみた例。

[Go Playground](https://go.dev/play/p/DDtuiq_VxwV)

“`go
func main() {
var i any
i = 42 // int
i = “foo” // string

i = struct {
s string
}{
s: “bar”,
} // struct

i = func() {} //関数

元記事を表示

【初学者はとりあえずこれでOK】とにかく書いてみるGraphQL スキーマ設計3ステップ

## はじめに
この記事が、GraphQL はじめてみたいけど、スキーマ設計とかクライアントライブラリとか、色々な情報が溢れていてわからないといった初学者向けに、まずはこれで書いてみよう!と迷わず実際に触るための一助になれば嬉しいです。

## スキーマファーストとコードファースト

GraphQLを使ったAPIの開発では、**2つの進め方があります。**
GraphQLってなにー??な状態の方はまず[こちらの記事](https://speakerdeck.com/kazukihayase/graphqlkuraiantonoji-shu-xuan-ding-2023dong?slide=14)の前半部分をどうぞ。

進め方1つ目の**スキーマファースト**では、まずGraphQLスキーマ(型定義)をサーバーチーム、フロントチームが一緒に話して作成します。作成したスキーマの設計を基盤として、両チームが実装を並行して進めていくことができます。

2つ目の**コードファースト**は、GraphQLスキーマ(型定義)を、主にサーバーチームが作成します。**まずサーバーのコードを書き、そこか

元記事を表示

Goのテストを書いてみる

## はじめに
Goでテストコードを書いてみました。

## 足し算と引き算をする関数
“`go
package math

func Add(a, b int) int {
return a + b
}

func Sub(a, b int) int {
return a – b
}
“`

## テストコード

1つずつの条件でも書けるし、テーブルドリブンテストで複数条件を構造体に定義して、ループで回すことでテストを分かりやすく書くことができる。

“`go
package math_test

import (
“testing”

“example/math”
)

func TestAdd(t *testing.T) {
want := 3
if got := Add(1, 2); got != 3 {
t.Errorf(“want %d but got %d”, want, got)
}
}

func TestSub(t *testing.T) {
// テーブルドリブンテスト
tests := []struct {
name string

元記事を表示

【Go】地味に嬉しい整形ライブラリ – pretty

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)

今回は複雑な構造体や、ログなどを見やすく整形してくれるGoのライブラリである**pretty**をご紹介します!

# prettyの魅力
こちらの [The Go Playground](https://go.dev/play/p/IiwoGJ79IOb) でも体験できるように、`pretty.Formatter()`を使うことで整形された結果を確認することが出来ます!

“` main.go
package main

import (
“fmt”

“github.com/kr/pretty”
)

func main() {
type myType struct {
a, b int
}
var x = []myType{{1, 2}, {3, 4}, {5, 6}}
fmt.Printf(“%# v\n”, x)
fmt.Printf(“%# v”, pretty.Formatter(x))
}
“`

“` zsh
[]main.myType{main.myType

元記事を表示

OTHERカテゴリの最新記事