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

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

Goでベンチマークを測ってみた

## はじめに
Goで関数のパフォーマンスを測ってみたいと思い、調べて使ってみました。

## コード
文字列をループで回して結合する関数
stringsのJoinで結合する関数
どちらのほうがパフォーマンスがいいか計測してみます。
“`main.go
package main

import “strings”

func ConcatenateStrings(strs []string) string {
var result string
for _, str := range strs {
result += str
}
return result
}

func JoinStrings(strs []string) string {
return strings.Join(strs, “”)
}

func main() {
// main関数には実行コードがなくても大丈夫です
}
“`

ここでは、1000個の配列テストデータを作成して、それを対象関数に渡しています。
testing.Bがベンチマーク用のパッケージになります。
“`main_test.

元記事を表示

Goでトランザクション処理をやってみる

## はじめに
タイトルどおり、Goでトランザクションを張って処理を実行してみます。

## コード

ポイントは、defer tx.Rollback()で、ロールバックを予約しておくことです。
こうしておくことで、処理がコケたときに自動でロールバックが実行されるようになりますし、エラーハンドリング内でロールバックの記述漏れが発生することがなくなります。
コミット後は、ロールバックは実行されないのでこれでOKです。

“`go
package main

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

_ “github.com/go-sql-driver/mysql”
)

var (
dbUser = os.Getenv(“DB_USER”)
dbPassword = os.Getenv(“DB_PASSWORD”)
dbDatabase = os.Getenv(“DB_NAME”)
dbConn = fmt.Sprintf(“%s:%s@tcp(127.0.0.1:3306)/%s?parseTime=tru

元記事を表示

Dockerで開発したGoアプリケーションをRenderでデプロイする

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

バックエンドのリリースにRenderを利用しているのですが、意外とGo&Dockerのruntimeでデプロイしている情報が少なかったので、せっかくならアウトプットしていきたいと思います!

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

# この記事で扱わないこと
– Renderの基本的な使い方
– Blueprintでのデプロイ方法など

# render.yaml
いきなり結論ですが、以下Blueprintの構成になります。

“`yml
version: “1”

services:
– type: web
name: paput-api
runtime: docker
dockerContext: .
dockerfilePath: ./d

元記事を表示

Golang 環境構築手順 (mac)

## Goのインストール
最新バージョンの記載は[GoのWebサイト](https://go.dev/dl/) に記載があります。
“`
$ brew install go
“`
以下のようにバージョンが正しく表示されれば成功です。
“`
$ go version
go version go1.22.5 darwin/amd64
“`
## パスを通す
“`
$ vim ~/.bash_profile
“`
下記を追記
“`:.bash_profile
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
export PATH=$PATH:/usr/local/go/bin
“`
.bash_profileを反映
“`
$ source ~/.bash_profile
“`

元記事を表示

Go 環境構築〜初歩的な部分に関するメモ

本記事は、自分用と他人用が半々の気持ちで書いています。
うp主はあまり賢く無いので、認識のおかしいところがあるかもしれません。
ここは違うのでは?と言う部分があればご指摘いただければと思います。

# 環境構築について
#### 公式サイトからファイルを落としてきてインストール(https://go.dev/dl/)
/usr/local/goに入る
> `brew install go`でもインストールできるが、勝手に更新される可能性があるらしいので公式サイトを選択した。
バージョン管理はツールを追加しなくても公式でできるっぽい?
https://go.dev/doc/manage-install

#### PATHを通す
ターミナルを開いて`cd ~`して`ls -a`で.zshrcがあることを確認
`vi .zshrc`でファイルを開きパスに関する記載を探して/usr/local/go/binを追記
> pathに追記するのと`export PATH=〜`の違いをいまいち理解していないため追記の形をとっている

> viの操作は最低限以下を覚えていれば問題ないと思う
i

元記事を表示

Goでファイルの読み書きをする

## はじめに
Goでファイルの読み書きをしてみようと思い、書いてみました。
os.Create()でファイルを作り、その戻り値のfile.Write()でデータを書き込み、そのファイルを最後に読み込んでいます。

## コード
“`go
package main

import (
“fmt”
“io”
“os”
)

func main() {
// 書き込み用のデータ
data := []byte(“Hello, World!\nThis is a sample text.”)

// ファイルを作成
file, err := os.Create(“example.txt”)
if err != nil {
fmt.Println(“ファイルの作成中にエラーが発生しました:”, err)
return
}

// ファイルにデータを書き込む
_, err = file.Write(data)
if err != nil {
fmt.Println(“ファイルの書き込み中にエラーが発生しました:”, err)
return
}
f

元記事を表示

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の署名と検証をやってみる

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

## コード
“`go
package main

import (
“crypto/rand”
“crypto/rsa”
“encoding/json”
“time”

“github.com/lestrrat-go/jwx/v2/jwa”
“github.com/lestrrat-go/jwx/v2/jwk”
“github.com/lestrrat-go/jwx/v2/jwt”
)

func toJwksJson(kid string, rawKey interface{}) string {
jwkSet := jwk.NewSet()

key, _ := jwk.FromRaw(rawKey)
key.Set(jwk.KeyIDKey, kid)
jwkSet.AddKey(key)
jb, _ := js

元記事を表示

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の様な感覚でメモを閲覧し、簡単にインプットできるサービ

元記事を表示

OTHERカテゴリの最新記事