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

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

goroutine, channelについて

## goroutine

Go言語では、ゴルーチン(goroutine)と呼ばれる軽量なスレッドを使用して、並行処理を実現することができます。ゴルーチンはGoランタイムによってスケジュールされ、マルチコアのCPUやスレッドプールに対して効率的にマッピングされます。

ゴルーチンを使うことで、非同期な処理や並行処理を直感的かつ簡単に実現できます。ゴルーチンは、goキーワードを使って関数の呼び出し前に開始されます。ゴルーチン内での処理は非同期に実行され、ゴルーチン間でのデータの共有には明示的な同期が必要です。

以下に、ゴルーチンの例を示します。

“`
package main

import (
“fmt”
“time”
)

func main() {
// ゴルーチン内で非同期に関数を実行
go sayHello()

// メインゴルーチンからの処理
for i := 0; i < 5; i++ { fmt.Println("メインゴルーチン:", i) time.Sleep(time.Millisecond * 500) } } func sayHe

元記事を表示

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

こんにちは。

Part 2は準備(Go)についてです。

# 目標

今回はGoのホットリロード環境を作っていきます。
(ホットリロードとはコードの変更をアプリケーションに自動的に反映することです。)

テストを書きませんので、変更を確認しやすくするためにホットリロード環境を構築したいと思います。

# 準備

+ goのバージョン
“`
% go version
go version go1.20.6 darwin/amd64
“`

ディレクトリで下記のコマンドを実行します。
“`
% go mod init login-example
go: creating new go.mod: module login-example
“`

echoもダウンロードします。
“`
go get github.com/labstack/echo/v4
go: downloading github.com/labstack/echo/v4 v4.11.1
go: downloading github.com/labstack/echo v3.3.10+incompatible

元記事を表示

Go言語のパッケージとモジュールについて

## 1. パッケージ

Go言語のパッケージは、関連するGoのコード(関数、型、変数など)を一まとめにするための単位です。パッケージはコードの再利用と整理を容易にします。

Goのコードファイルは、必ず特定のパッケージに所属します。所属するパッケージは、ファイルの最初の行で`package`キーワードを用いて明示します。例えば、`package main`はそのファイルが`main`パッケージに属していることを示します。

同じパッケージに属するファイル群は、同じディレクトリに配置されます。そして、パッケージ内のすべてのファイルはパッケージレベルの変数や関数を共有することが可能です。

## 2. モジュール

次にモジュールについて見ていきましょう。モジュールはGo 1.11で導入され、関連するパッケージの集合を表現する単位となります。モジュールの存在により、パッケージのバージョン管理や依存関係の追跡が簡単になります。

モジュールは`go.mod`ファイルによって定義され、このファイルはモジュールのルートディレクトリに配置されます。このファイルにはモジュール名(通常はリポジトリの

元記事を表示

APG4g(Go言語入門 APG4b)【1.00 ~ 1.02】

# 本記事について

競技プログラミングサイトの1つである[AtCoder](https://atcoder.jp/home)では、プログラミング学習教材の[APG4b(AtCoder Programming Guide for beginners)](https://atcoder.jp/contests/APG4b)が公開されています。使用言語はC++です。

また、sabaさんによって、[Python版APG4b](https://qiita.com/saba/items/b9418d7b54cce4b106e4)も書かれています。さらに、その他多くのプログラミング言語を使ったAPG4bの記事が公開されています。

本記事では以上のコンテンツに則り、Go言語版APG4bを書いてみたいと思います。

今回扱う内容は以下の通りです。

– [1.00. はじめに](#100-はじめに)
– [1.01. 出力とコメント](#101-出力とコメント)
– [1.02. プログラムの書き方とエラー](#102-プログラムの書き方とエラー)

本記事での目標は、以下の3点です。

1. A

元記事を表示

Go 関数 基礎固め

## 名前付き関数
“`
package main

import (
“fmt”
)

func Plus(x int, y int) int { // ()intは引数の型と 外のintは返り値の型
return x + y //int型の返り値 returnで値を返す時は 返り値の型を指定する必要になる
}

func Div(x,y int) (int, int) {
q := x / y
r := x % y
return q, r //返り値が二つある だから(int, int)
}

func Double(price int) (result int) { //返り値に変数も指定できる。変数resultを宣言。
result = price * 2 //resultにpriceの2倍の値を入れる
return //(result int)で指定してるのでreturnの中身は省略できる
}

func Noreturn() { //返り値がない関数
fmt.Println(“No Return”)
return
}

func main() {

i

元記事を表示

( ´∀`) < モナーがechoしてくれる `monaco`って言うコマンドを作りました

# モナーって知ってますか?
モナーは某ネット掲示板の2ちゃんねる(今は5ちゃんねる)で愛されているアスキーアートの1つで
「お前が言うな」 や 「お前も一緒やろ」 的なニュアンスで使われているやつです

# 制作に至った経緯
〜ある日の深夜〜
私 「モナーがechoしたら面白いんじゃね?」
私 「モナーがecho、モナーがエコー、モナーエコー、モナコ、monaco でええやん」
と言う思いつきと深夜テンションのままに作ったコマンドになります
開発してから結構な日数が経っているんですが供養させてください?

ただ、1つだけ問題がMSのOSSの [Monaco Editor](https://microsoft.github.io/monaco-editor/) と名前が被ってるんですよね

## リポジトリはこちら
http

元記事を表示

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

こんにちは。

Go言語で仮登録・本登録・ログイン機能だけのアプリを作成します。

追加で
“`
・CORS+CSRF
・リフレッシュ
・アクセス回数制限
“`
なども扱ってます。

# Part 1 はじめに

## 何を作るのか?

ユーザーの仮登録、本登録、ログイン、制限されたリソースへのアクセスをするだけのWEBアプリ

## 何が学べるの?

ログイン処理が学べます

追加で
“`
・docker composeの基本的な使い方
・JWTの基本
“`

## 前提

“`
– Go 1.20.6
– WEBのフレームワークとしてlabstack/echoを使用します。
– データベースとのやりとりはjmoiron/sqlxを使用します。
– 認証トークンとしてJWTを使用します。また、lestrrat-go/jwxを使用します。
– メールサーバーはmailhogを使用します。
– テストは書かない
“`

## 作成するエンドポイント

* 仮登録 /auth/register/initial
– クライアントからemail, passwordを受け取る

元記事を表示

echoでstrapi REST APIのようなパラメータを受ける

# 最初に
フロントからの特定のリソースに対して検索リクエストが飛んでくる。
そのリクエストはechoで動くサーバがさばく。
検索クエリはstrapi REST API(ここでは以下strapi API)のようになっていることが要件で
汎用性 <【優先度】< ビジネスロジックとのマッチ とすることが条件となっている。 そうした場合、こうやって組みましたの一例を紹介する。 # リクエスト内容を分解する strapi APIでは、ある規格化されたリクエストパラメータを送ることで 柔軟な検索リクエストを受けることができる。 パラメータ参考;[Parameters | Strapi Documentation](https://docs.strapi.io/dev-docs/api/rest/parameters) その処理を模すには、まず処理できる形にリクエストを分解しなければいけない。 その内容について、書いていく。 ## controller リクエストを受け取った後、parameters構造体に当てはまるよう分解するメソッドに渡す ~~~go import ( searc

元記事を表示

Go言語:ゴルーチンの完全な終了を確実にする方法

## はじめに
Go言語では、非同期のタスクを実行するための手段としてゴルーチンを利用することが一般的です。
しかしながら、その利用には注意が必要です。今回はその一つ、`main`関数が終了すると共にゴルーチンも終了してしまう問題とその解決策について記載します。

## ゴルーチンと`main`関数の関係性

まずは以下のゴルーチンが含まれたコードを見てみましょう。

“`go
package main

import (
“fmt”
)

func sayHello() {
fmt.Println(“Hello”)
}

func sayWorld() {
fmt.Println(“World”)
}

func main() {
go sayHello()
go sayWorld()
}
“`

このコードでは、`main`関数が`sayHello`と`sayWorld`のゴルーチンを起動します。
しかし、ここには一つ問題があります。それは、`main`関数が終了すると全てのゴルーチンも終了するというGoの特性上、これらのゴルーチンが終了する前に`main`関数が終了

元記事を表示

組織でGPTのプロンプト活用するのにお役立ちなツール書いたで!!

# い・しゅー

こんな課題が神々の大地からウォーターフォールしてきてないかな?

– プロンプトのDBを作ってノウハウを蓄積したい
– かつ、誰でも登録出来て誰でも検索させたい
– かつ、出力結果を実際の出力に近い形で分かりやすく参照したい
– かつ、どのくらいの利用があったか可視化出来る仕組みがほしい
– かつ、**分かりやすく使いやすいインタフェースから操作させたい!**

#### いやー無理っす!!!

となるところだけど、僕らが普段使いのslackをラップすれば出来そうな予感がしたので作ってみた
slackだとみんな使ってるから操作を覚える学習コストも少ないし、**スマホとかからも出来て良いよね!!**

# こ・れ

# おもな動作

– **

元記事を表示

Gormの使い方について

こんにちは。

GORMはデベロッパーフレンドリーを目指した、Go言語のORMライブラリです。
goを使ってGORMを使ってデータベース操作する必要があると思います。

# インストール

“`
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
“`

# データベーススキーマの作成

スキーマの作成の仕方についてみていきます。

## マイグレーション(Migrate)

Migrateは、接続先のスキーマを参照して、テーブルやカラムがなければ自動的に作ってくれるコマンドです。

![Screenshot 2023-07-17 at 6.23.52 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507088/92c8f5e7-efc6-d3ce-71f2-258ceb9380ad.png)

“`
db.AutoMigrate(&User{})

db.AutoMigrate(&User{}, &Product{}, &Orde

元記事を表示

[Azure] Container Apps 機能調査

## Azure Container Apps

Azure Container Appsは、Azure上でコンテナベースのアプリケーションを初めて構築する開発者やエンジニアに向けたサービス。以下に、Azure Container Appsの概要と主な機能について詳しく説明する。

### 概要
Azure Container Appsは、コンテナ化されたアプリケーションのデプロイや実行を簡素化するためのパス(PaaS)サービス。このサービスは、開発者がアプリケーション自体に集中することができるよう、インフラストラクチャの詳細を隠蔽している。Azure Container Instancesをベースにしており、コンテナのスケールやネットワーキング、セキュリティなどの管理を自動化する。

### 主な機能
1. **コンテナのデプロイと実行**: Azure Container Appsは、独自のデプロイメントテンプレートを使用して、コンテナイメージを自動的にデプロイし、実行します。開発者は、ローカルで作成したコンテナイメージをAzure Container Registryにアップロー

元記事を表示

Goのテストコードを書く時パッケージ名に_testをつけるべきか?

Goでテストを書きたい時にテストコードには`_test`のsuffixをつける時と

同一パッケージでテストコードを書いている例があります。

どちらが正しい書き方なのか調べてみました。

## _testをつけている例

stringsパッケージでは`_test`のsuffixをつけてテストコードを書いています。
https://go.dev/src/strings/search_test.go

“` go
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package strings_test
“`

## _testをつけていない例
bzip2パッケージでは`_test`をつけずにテストコードを書いています。

https://go.dev/src/compress/bzip2/bzip2_test.go

元記事を表示

VSCodeでGoの開発環境を簡単に作る

## はじめに

Go入門中の者です。
GoLandに課金するのはちょっと気が引けるので、VSCodeで簡単な実行環境を作ってみました。

色々な記事が出ているけど、結果Microsoftの記事が一番分かりやすく簡単でした。

https://learn.microsoft.com/en-us/azure/developer/go/configure-visual-studio-code

## 前提

VSCodeがインストールされている
記事に出てくるコマンドはMacを前提としております

## 手順

### 1. Goをインストールする

下記のサイトから、任意のバージョン/OSのGoをインストールする
(余談:私はasdfを使ってインストールしてます)

https://go.dev/doc/install

### 2. VSCodeの拡張機能「Go」をインストールする

これ↓です!
![スクリーンショット 2023-07-17 9.43.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0

元記事を表示

【GO言語】mysqlへの接続でやらかしたこと

# やろうとしたこと
GO言語の公式チュートリアルのコードを基に(ほぼコピペ)ローカルのmysqlサーバに接続して、DBのデータを参照したり、書き込んだりするプログラムを書こうとしました。

# 書いたコード(エラー解消前)
以下、エラーが発生するコードです。
“`main.go
package main

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

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

var db *sql.DB

type Album struct {
ID int64
Title string
Artist string
Price float32
}

func albumByArtist(name string) ([]Album, error) {
var albums []Album

rows, err := db.Query(“SELECT * FROM album WHERE artist = ?”, name)

if err != nil {
return

元記事を表示

【M1/M2】asdfでGoをインストールするとreturned status 404というエラーが発生する

## 概要
Macbook(M2)でasdfを用いてGo1.11.1をダウンロードしようとすると`returned status 404`が返却される

“`zsh
$ asdf install golang 1.11.1
Platform ‘darwin’ supported!
URL: https://dl.google.com/go/go1.11.1.darwin-arm64.tar.gz returned status 404
“`

## 前提

・macOS Monterey 12.5.1
・asdf: v0.11.3
・ダウンロードしたいGoのバージョン: 1.11.1

## 解決策

asdf installコマンドの先頭に`ASDF_GOLANG_OVERWRITE_ARCH=amd64`をつける

“`zsh
$ ASDF_GOLANG_OVERWRITE_ARCH=amd64 asdf install golang 1.11.1
“`

## 参考

https://github.com/asdf-community/asdf-golang#archit

元記事を表示

Golang 学習した外部ライブラリ まとめ 随時更新

“`
go get github.com/gin-gonic/gin
“`
Gin は、高速かつ軽量なWebアプリケーションフレームワークであり、Go 言語での Web 開発をシンプルにするための多くの機能を提供します。ルーティング、ミドルウェア、JSON レスポンスの生成などの機能を簡単に実装できるため、効率的で堅牢な Web アプリケーションを作成するのに役立ちます。

の例では、単純なAPIエンドポイントを作成し、リクエストを受けた際に “Hello, World!” というメッセージを返すものです。

“`
package main

import (
“github.com/gin-gonic/gin”
)

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

// GETリクエストを処理するハンドラ
r.GET(“/hello”, func(c *gin.Context) {
c.JSON(200, gin.H{
“message”: “Hello, World!”,
})
})

r.Run(“:8080”)
}
“`

元記事を表示

Go × PostgreSQL × SQLBoiler (ORM) × golang-migrate (マイグレーション) の開発環境を構築する

毎回環境を作るときに何かしらド忘れしてしまい手こずってしまうので忘れないようにメモ。

# はじめに
– 下記の知識や経験があることを前提にしてます
– Go言語の基礎を理解している
– Dockerと docker-compose の基礎を理解している
– バックエンド開発やデータベースの基礎を理解している
– ORMの使い方や各種コマンドの詳しい説明はしません
– パスなどはご自身のプロジェクトの構成に合わせて適宜変更してください

作ったもののサンプルです。

https://github.com/Takenari-Yamamoto/golang-dev-env/tree/main

# 開発環境
– Go1.20
– PostgreSQL 15
– Docker
– docker-compose

# 使用するツール

### SQLBoler v3.7.1

https://github.com/volatiletech/sqlboiler

### golang-migrate v4.15.2

https://github.com/golang-migrat

元記事を表示

GoのORMの人気ランキングを年ごとにまとめてみた

# 概要
GoのO/R Mapperについてまとめてみました。
GoのO/R Mapperを選定する際に、gormは有名だけど他にないかな〜と思ったため興味本位で探してみました。

## 取得方法
取得方法として、GitHub-APIを使用しました。
理由として年単位でスターの上がり幅を比較し、流行りすたりを可視化したかったためです。
※取得対象はスターの数が1,000個以上リポジトリのみとなります。

実際のリポジトリは以下になります。
https://github.com/RyotaroSeto/star-golang-orms

## 年間隔スター数上限グラフ
[![orm_chart.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843952/a4ae95b3-dca5-010a-db74-d2de46e8bd05.jpeg)](https://ryotaroseto.github.io/star-golang-orms/output/orm_chart.html)

## リポジトリごと

元記事を表示

【忙しい人のための】 Security Best Practices for Go Developers

あなたのGoで書かれたプロジェクトは[go.dev](https://go.dev/)が提唱するセキュリティベストプラクティスに従っていますか?
実は、GoのチームはGo開発者のためのセキュリティベストプラクティスを公開しています。

これ↓

https://go.dev/security/best-practices

一次情報を読むことをお勧めしますが、英語が苦手な人や、サクッと概要だけ見たい忙しい人も多いと思います。

そんなあなたのために、心優しい私が要約しましたので活用してください。

## ソースやバイナリに脆弱性スキャンをする

– [govulncheck](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck)を使って脆弱性を検知する
– [チュートリアル](https://go.dev/doc/tutorial/govulncheck-ide)
– Govulncheck は CI/CD フローに組み込むこともできる
– GoチームはGitHubマーケットプレイスに[govulncheckのためのGi

元記事を表示

OTHERカテゴリの最新記事