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

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

A Tour Of Go Exercise

# A Tour Of GoのExercie集

https://go-tour-jp.appspot.com/list

# Exercise: Loops and Functions

https://go-tour-jp.appspot.com/flowcontrol/8

“`go
package main

import (
“fmt”
)

func Sqrt(x float64) float64 {
z := 1.0
for i := 0; i < 10; i++ { z -= (z*z - x)/(2*z) fmt.Println(z) } return z } func main() { fmt.Println(Sqrt(4)) } ``` # Exercise: Slices https://go-tour-jp.appspot.com/moretypes/18 ```go package main import "golang.org/x/tour/pic" func Pic(dx, dy int) [][]uint8 { ma

元記事を表示

go言語 外部コマンドの備忘録

## Go言語の外部コマンドでハマった件の備忘録

### やりたかったこと
goの外部コマンドからconda activate 環境名で仮想環境のアクティベートしてpythonファイルを動かしたい

“`
import (
“log”
“os/exec”
“fmt”
)

func main(){
out, err := exec.Commond(conda activate 環境名).Output()
if err = nil{
log.Fatalln(err)
}
fmt.Println(string(out))
}
“`
これでいけるかと思ったがエラー( status exit 1 )しか返ってこない

外部コマンドでconda仮想環境をアクティベートするときは
exec.Command()の引数を(“bash”, “-c”, “source activate 環境名”)とするらしい

ということで

“`
import (
“log”

元記事を表示

Golang + Reactで並び替えができる配列のDBテーブル・フォームを作ってみた

## はじめに
前回はポートフォリオを大改造してデータをデータベースで管理するようにしました。

https://qiita.com/piny940/items/f1a15f7a797c4d0f7461

今回は、前回やり残した「プロジェクトの並び替え」部分を実装した話を記そうと思います。

## 抱えていた問題

前回ポートフォリオのデータをデータベースで管理する方向性にシフトしたのですが、DB設計の段階で考え漏れていたことがありました。それは「プロジェクトの並び替え」です。
プロジェクトは現状、写真のようにスターがついたものが上に来るようになっているのですが、Starがついたプロジェクト同士 / Startがついていないプロジェクト同士の順序については操作ができない設計になっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330232/6c0689e6-10b5-b54f-df1b-845fa0f4827e.png)

そこで今回は、順序を保存するカラムを追加

元記事を表示

Goのポインタ使い所,使わなくていい所

# ポインタってどういう時に使うべき?
Goにおけるポインタの使い所は難しいと思います. というのも,Goはスライスやマップなど値かポインタかが初見では分かりづらいようなデータ構造があります.直感的に分かりづらく,ポインタでなければうまく動かない処理があったりします.Goのポインタ周りは感覚でコードを書くと,意外なエラーや,予想外の挙動に直面します.

具体的には,以下のような状況において,私はポインタを使うかどうかよく迷います.
– 関数の引数(配列,スライス,マップ)は,ポインタと値どちらが適切か?
– 構造体をマップに格納する時,よくポインタが格納されているが値ではダメなのか?
– メソッドのレシーバ引数は値とポインタどちらが良いのか?
– Rangeループは配列やスライスの要素を書き換えられるか?

今回の記事では,Goのポインタについて,宣言や値のポインタ化などの基礎構文から,ポインタの使い所を具体例を交えつつ,解説していきたいと思います.

# ポインタの基礎構文
## 宣言
cなどは変数名の前に\*をつけますが,Goでは型の前に\*をつけてポインタを定義します.

“`

元記事を表示

テスト投稿

これはテスト投稿です。

元記事を表示

GoでSSG(静的サイトジェネレーター)を手作りしてみた

## 目的

この記事([Writing a Static Blog Generator in Go](https://www.zupzup.org/static-blog-generator-go/index.html))を読んでから自分でもやってみたいなと思っていたのでゴリっと作ってみました。

既存のSSGの置き換え等々は全く考えておらず、あくまでも興味駆動の開発になります。

## 作ったもの

https://github.com/K-Sato1995/go-simple-ssg

↑を使用して作った静的サイト

https://go-simple-ssg.vercel.app/

## 構成

やった事としては大枠

– マークダウン(記事のコンテンツ)+テンプレート(HTML)を元に静的なファイルを生成する部分
– CLIで↑を利用して誰でもプロジェクトの骨組みができるようにする部分

だけなので大したことはしていないのですが全体感としては下記のようになりました。

“`
./
├── parser/ (MarkdownをパースしてHTMLに変換する部分)
│ ├

元記事を表示

golang[Go言語]でインポート分のパスを指定する方法。

# 記事作成背景
import分変えたいなって思った時どこを変えたらよいか自分用のメモです。

# 修正内容
go.modのmoduleを変える。
“`go:go.mod
module business←ここ

go 1.15

require (
github.com/go-sql-driver/mysql v1.5.0
github.com/joho/godotenv v1.3.0
)

puts ‘The best way to log and share programmers knowledge.’
“`

元記事を表示

[Go言語] スライスを効率的にソートする方法

## はじめに
Go言語はそのシンプルさと効率の良さで人気を集めていると思っている。特に、スライス(動的配列)の操作はGoの重要な特徴の一つです。今回は、Go言語でスライスをソートする具体的な方法を、実用的な例を交えてご紹介しようと思います。

## サンプルコードと説明
“`go
package main

import (
“fmt”
“sort”
“time”
)

type Article struct {
Title string // 記事のタイトル
CreatedAt time.Time // 記事が作成された日時
}

// Articles は複数のArticleを含むスライスです。
type Articles []Article

// SortByCreatedAt はArticlesをCreatedAtフィールドに基づいて昇順にソートします。
func (a Articles) SortByCreatedAt() {
sort.SliceStable(a, func(i, j int) bool {
return a[i].Cre

元記事を表示

【GO】Gormを使って子テーブルのデータを取得したい

# はじめに
GORMを使って、親と子テーブルのデータを両方取得するのに苦労したので、備忘録として残しておきます。
GORMは[公式ドキュメント](https://gorm.io/ja_JP/docs/index.html)が丁寧に書かれているので、そちらも合わせてご覧いただくと良いかと思います。

# 結論
`preload`を使って、子テーブルのデータを取得しました。
`preload`とは、Eager Loading(イーガーローディング)の一種で、メインのクエリと一緒に関連するデータを予め読み込む機能です。これにより、N+1問題を避けて子テーブルのデータを取得できます。
`JOIN`と`SELECT`を使うことでも子テーブルのデータを取得できたのですが、今回はより簡単に使える`preload`を採用しました。
以下の構造体を例に`Preload`の使い方を簡単に説明します。
“`go
// UserがOrderをhas manyで持つ
type User struct {
Name string
Email string
Orders []Order
}

//

元記事を表示

【Go言語】for文の奇妙な動作

# 奇妙な動作をするfor文

まず、最初に奇妙な動作をするコードの例を出します。
以下のコードでは、for文の中でgoroutineを実行している。 **main** のgoroutineが終了するのを防ぐために `sync.WaitGroup` を使用している。 (WaitGroupを知らない人は[GoのWaitGroupを理解する](https://zenn.dev/yamato0211/articles/e3da679fd8dd6f)を参考)

“`go
func main() {
var wg = &sync.WaitGroup{}
for i := 0; i < 10; i++ { wg.Add(1) go func() { fmt.Println(i) wg.Done() }() } wg.Wait() } ``` [Go Playground](https://go.dev/play/p/x7rCyVdyO3j) これを実行すると、 ```:実行結果 10 10 10 10 ・・・・ 10 10 ``` `i < 9` と設定し

元記事を表示

ポートフォリオをGolang + Graphql + Next.jsで大改造した話

## はじめに

先日ポートフォリオ(http://www.piny940.com )を大改修したため、その記録を残します。

http://www.piny940.com

完成したコードは以下のGithubで公開していますので参考程度にどうぞ。

https://github.com/piny940/portfolio

## 環境
– Next.js 14.1.0
– Golang 1.21.1

## 抱えていた課題
今まで、ポートフォリオ上の「ブログ」や「技術スタック」「プロジェクト」のデータはすべてYAMLファイルで管理していました。
しかし、この方法には次の2つの問題点がありました。
– YAMLファイルに書かれたデータの整合性を保証できない
– データ更新にいちいちYAMLファイルを書き換える必要がある

特に2点目の問題についてはかなり深刻で、現状だとデータを書き換えるのに毎回ファイルを書き換えてPull Requestを出して・・・という作業が必要で、結果的にポートフォリオの更新をさぼってデータが古いまま放置されてしまっているという実情がありました。
また、

元記事を表示

【GO】コンパイラによるレシーバの暗黙的変換ってなに?

# はじめに
ありし日の自分は以下のコードが正常に動作することに疑問を感じてました。
“`golang
type Dog struct {
Name string
}

func (d *Dog) Speak() {
fmt.Printf(“Woof, I am %s\n”, d.Name)
}

func main() {
dog1 := &Dog{Name: “hoge”}
dog1.Speak() // => Woof, I am hoge
dog2 := Dog{Name: “fuga”}
dog2.Speak() // => Woof, I am fuga
}
“`
「`*Dog`というポインタ型に対して`Speak()`は定義されているけど、`Dog`という値型には`Speak()`定義されてないのだから、`dog2.Speak()`はpanicするはずでは?」と脳内にはてなマークを浮かべてました。
疑問を先輩にぶつけてみたところ、腑に落ちる説明を頂いたので備忘録としてまとめておきます。

# 結論
「コンパイラによる暗黙的変換が行われているから」です。

元記事を表示

gorm gen を使用してデータベースから構造体を作成する

# 背景
最近会社でGolangのプロジェクトに入りAPIを作成しています。その際にDBのデータを受け取る構造体を作成するのが非常に面倒でした。特に、gormタグの作成が面倒でスキーマに応じて変更する必要があります。
これを手作業で作成している時、先輩に`gorm gen`があるから使ってみたらと言われ少し触ってみたのでわかったことを書いていきます。

https://gorm.io/gen/database_to_structs.html

# 特定のテーブルのみを作成する
“`go:main.go
users := g.GenerateModel(“users”)
articles := g.GenerateModel(“articles”)
g.ApplyBasic(users, articles)
g.Execute()
“`

# スキーマと異なるテーブル名,カラム名にする
“`go:main.go
users := g.GenerateModelAs(“users”, “changedUsers”,
gen.FieldRename(“name”, “changedN

元記事を表示

GoでgRPCサーバーを立ててみる3(repository.goの実装)

お疲れ様です。

今日は「repository.goの実装」について部分いたします。

articleサービスにおいてDBとやり取りをするrepository.goの実装を行なっていきます。

今回は簡易的なデータベースとしてsqlite3を使用するので、以下のパッケージをインストールしておきましょう。

“`terminal
go get github.com/mattn/go-sqlite3
“`

インストールできたら、忘れずにimportしておきます。

“`article/repository/repository.go
package repository

import (
_ “github.com/mattn/go-sqlite3”
)

“`

articleサービスでは、以下のようなarticlesテーブルにデータを格納していきます。

| id | author | title | content |
|:———-:|:—————:|:

元記事を表示

Protocol BuffersのOptionをGo側で読み取る方法を考える

## はじめに

[Protocol Buffers](https://github.com/protocolbuffers/protobuf)では、Enumを宣言してGoのコードを生成すると、基本的には `string` ↔ `int32` の対応関係が生成される。しかし、この `string` に使える文字種は、[Specification](https://protobuf.com/docs/language-spec#enums)によると、 `[A-Za-z_]` の範囲に限られる。そのため、これ以外の文字種を使いたい場合は、他の方法で表現する必要がある[^1]。

[^1]: 例えば、認可グラントをEnumで表現したい場合、`urn:ietf:params:oauth:grant-type:jwt-bearer` のような値を設定することはできない。

変換ロジックを外部に置くことも出来るが、その場合は各言語で実装することになるため、対応関係に差異が生じる危険性がある。そこで、オプショナルな値をProtocol Buffers側で宣言し、各実装でオプションの値を取得する方法を

元記事を表示

【Go】JWT認証をGinで必要最低限の実装をした

## やりたいこと
Ginでユーザーログイン機能を実装し、ログインユーザーだけがアクセス可能なエンドポイントをJWT認証を使って実装したい。

## JWT認証の仕組み
### JWTとは
### JWT認証の仕組み

## Ginで実装してみる

### “`main.go“`
“`go:main.go
import (
“net/http”
“time”

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

func main() {
r := gin.Default()

r.POST(“/login”, loginHandler)

authGroup := r.Group(“/auth”)
authGroup.Use(authMiddleware)
authGroup.GET(“/”, func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{“message”: “you are authorized”})
})

r.Run(“

元記事を表示

goroutineを使用する際に注意すべきこと

for文で並行処理をしたい状況はたくさんあると思います。

“`go
var wg sync.WaitGroup
for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() fmt.Println(i) }() } wg.Wait() ``` 上記のコードを実行すると、どのような結果が得られると思いますか? ```shell 5 10 10 10 7 10 10 10 10 10 ``` 実行するごとに、異なる結果が出ると思います。 これは、goroutineの中で変数`i`を表示するときにはすでに、`for`ループが終了してしまっているからです。 これを回避するには、ループのスコープの中で新しい変数を宣言します。 この変更により、各ゴルーチンはそれぞれの`v`の値をキャプチャします。 ```go var wg sync.WaitGroup for i := 0; i < 10; i++ { v := i // 追加 wg.Add(1) go func() { defer wg.Don

元記事を表示

💩コード紹介(インターフェース)

# はじめに

自分で書いてしまった、またはどこかで見かけた💩コードをデフォルメして紹介します。
今回はGolangのインターフェースに関する💩コードです。

# 今回の💩コード

WEBアプリケーションです。
HTTPリクエスト/レスポンスのハンドリングと、ビジネスロジックを分けるために(多分)、`endpoint`と`service`パッケージが作成されています。

“` golang
package endpoint

import “service”

type SomeEndpoint struct {
svc service.SomeServiceInterface
}

func NewSomeEndpoint(svc service.SomeServiceInterface) SomeEndpoint {
return SomeEndpoint{
svc: svc,
}
}
“`

“` golang
package service

type SomeServiceInterface interface {
CreateRecord() error

元記事を表示

開発環境の整備のためのホットリロード

## 概要

EchoのAPI開発環境の整備のためにホットリロードを導入する。
また、WindowsでのDocker環境を使ったため少々特殊な事象が発生したのでそちらについてもまとめる。

## ホットリロードの必要性

GoのWebアプリケーションの開発環境において、ホットリロードが欲しくなるケースはある。
それは、一度実行されてしまうと状態を保持してしまうためだ。
何かしらの修正を行った際に、実行しなおさないと修正内容が正しく反映されているか確認がとれない。
開発時もそうだし、バグの検証などでデバックコードを埋め込んだりすることにおいて実行しなおしは効率が下がる要因になりやすい。
そこで、ホットリロードを採用して開発環境において、修正した際に都度再実行(リロード)してもうらようにしてこの問題を解消を目指します。
注意点としては、修正に対して自動で再実行されてしまうので、状態を保持したかった債などは注意が必要になる。特にIDEで自動保存が有効になっていると意図していない状態でリロードされる場合があるので気をつける必要がある。

## airの導入

### 前提

今回は以下の環境が

元記事を表示

ガチャ1000回実行するのに10秒かかるポンコツAPIを改善した話

# はじめに
今回は駆け出しエンジニアとして、バックエンドの開発で躓いたところがあったので共有したいと思います。
私と同じバックエンド初学者向けの記事ではありますが、経験豊富なエンジニアの方々からのFBにも期待して書いておりますので、是非ともコメントお願いします!!

# TL;DL
Goを用いたAPIの処理速度の改善
– BulkInsert
– マスターデータをメモリで保持する

# 前提
バックエンドに関する学習の一環で、ガチャAPIの実装を行っていました。概要は、ガチャを回すことで排出されるキャラクターをユーザごとに保管する簡素なアプリケーションのAPIです。テーブルは以下の通りです。

– ユーザテーブル : ユーザ名など
– キャラクターテーブル : キャラクター名
– ポゼッションテーブル : ユーザとキャラクターの中間テーブル
– エミッションテーブル : キャラクターのレアリティを保存している

それでは、実際にガチャを排出するハンドラーを見てみましょう。

~~~go
func (gh *GatchaHandler) PlayGatcha(c ec

元記事を表示

OTHERカテゴリの最新記事