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

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

【メモ】Goの環境設定

MacOSの場合

1. Goのダウンロードページにアクセス https://go.dev/dl/
2. 自分のPCのOSに応じ、選んでダウンロード
3. インストール
4. ターミナルで`ls /usr/local/go/bin`で`go`が表示されるかを確認
5. 右記を実行 `echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.zshrc`
6. 右記を実行 `source ~/.zshrc`で変更内容を適用
7. `go version`でバージョンが表示されたら成功

元記事を表示

Goで作るクリーンアーキテクチャの自己解釈まとめ

## 参考元
– https://qiita.com/arakawa_moriyuki/items/59ce00542d5859d60a2d [1]
– https://little-hands.hatenablog.com/entry/2018/12/10/ddd-architecture [2]
– https://zenn.dev/88888888_kota/articles/1a5caac8d743b8 [3]

## 本記事の内容
Go言語によるWebアプリの個人開発に挑戦中の非Web系エンジニアが、個人の勉強の過程で情報を整理するための自分向けページ。
調べる中で出てきた別ページの情報を1か所にまとめるために使用。
この記事を見て読者であるあなたが何か学べる、という内容ではありません、、、

# クリーンアーキテクチャの目的
## 設計思想
– 依存性逆転の原則(Dependency Inversion Principle): 高レベルのモジュールは低レベルのモジュールに依存すべきではなく、どちらも抽象に依存すべき。抽象は詳細に依存してはならない。
– 単一責任の原則(Si

元記事を表示

アプリ開発でGo言語を採用するメリット

# はじめに
Go言語は2007年にGoogleが開発した比較的新しいプログラミング言語です。
近年、日本の各企業でGo言語を使用してクラウドサービスを開発しています。
今回はクラウドサービスを開発する上でGo言語を採用するメリットをまとめました

# 一覧
+ パフォーマンスと効率性
+ 並行処理
+ 簡潔性と可読性
+ ライブラリ
+ クロスプラットフォームとコンテナ対応
+ 静的型付けと安全性
+ ミニマリズム
+ クラウドネイティブエコシステムとの相性

# 1.パフォーマンスと効率性
コンパイル言語であるGoは、インタプリタ言語のPythonやRubyに比べて高速に実行されます。これは、特にリアルタイムでのデータ処理や大量のトランザクションを扱うクラウドアプリケーションにおいて重要です。
“`go
package main

import (
“net/http”
“fmt”
)

func main() {
http.HandleFunc(“/”, func(w http.ResponseWriter, r *http.Request) {

元記事を表示

reviveでカスタムLintルールを設定する方法

### **はじめに**

Go言語のプロジェクトにおいて、コードの一貫性と品質を保つことは非常に重要です。標準のlintツールは多くの基本的なニーズを満たしますが、特定の命名規則やスタイルガイドに完全に準拠するためには、追加の設定やツールが必要になることがあります。この記事では、特に**`revive`**を使用してGoのコードに対するより厳格なlintチェックを行う方法について解説します。

### `revive`の導入

`revive`は`golint`の代替として推奨される、柔軟で高速なlintツールです。これは、Goのコードに対するスタイルと品質のチェックを提供し、カスタマイズ可能なルールと高速な実行が特徴です。

### `revive`の設定例

`revive`をプロジェクトに組み込む基本的な手順と、特定の命名規則をチェックするための設定例を以下に示します。

まず、`revive`を有効にするために、lint設定ファイル(例えば`.golangci.yml`)に以下のように追加します。

“`yaml
linters:
enable:
– reviv

元記事を表示

技術書典って何だ?面白そう!出展しよう!ってなった話

## はじめに
この記事は技術書典の存在を知ってから出展するまでの奮闘記になります。
企画〜出展までの体験やその時に迷ったことなどつらつら書いていきます!
まだやったことないけど、技術書典今後挑戦したい!という方の参考になれば嬉しいです!

## きっかけ
ある日の会社でのできごと。リーダーがなにやら面白そうな技術書をもってコンビニに行っておりました。曰く「過去に技術書典にて出展した本の余りが売れたので配送しにいく」とのこと。
色々話を聞いていくと、どうやら仲間と技術書を作って販売イベントがあるらしいということが分かりました。
「仲間と本を書いて、それを人に読んでもらう体験って素晴らしい!」と思い次の日には仲間数人を誘って技術書典15への出展を決意しました。
そこから専用のslackチャンネルとNotionを立ち上げて、やる気マックスで活動を開始!

## 企画
`(時期:2023年5月 ~ 2023年6月)`
やるとなったら決めなければいけないことがたくさんあります。
– チーム名
– タイトルや執筆内容
– スケジュール感

などなど。。
運営やスケジュール周りのことは僕が土台作っ

元記事を表示

distrolessの利用には依存関係に気をつけよう

“`
FROM amd64/golang:1.18 AS builder

ENV PROJECT xxx/xxxx/batch
WORKDIR /go/src/$PROJECT

# restore dependencies
COPY go.* ./
RUN go mod download

COPY . .
RUN go build -o /batch

FROM gcr.io/distroless/static AS release
WORKDIR /
COPY –from=builder /batch /batch
USER nonroot:nonroot
ENTRYPOINT [“/batch”]
“`
というようなDockerのマルチステージビルドをして、生成物も出力されているのに、ENTRYPOINTを実行すると
terminated: Application failed to start: “/batch”: no such file or directory
ファイルは確かにそこにあるのに、ファイルが見つからないという不思議なエラーになりました。
原因は、RU

元記事を表示

ローカルとGitHub Actionsでのgolangci-lint 設定方法

## **はじめに**

Go言語のプロジェクトにおいて、一貫したコード品質を維持することは重要です。この記事では、ローカル環境とGitHub ActionsのCI/CDパイプラインで**`golangci-lint`**を統一的に使用する方法について解説します。これにより、コードレビューの効率化と品質向上を図ることができます。

### `golangci-lint`とは

`golangci-lint`は、Go言語のための強力なlintツールです。複数のlinterを統合し、カスタマイズ可能な設定が可能です。([Introduction | golangci-lint](https://golangci-lint.run/))

### ローカル環境での設定

1. `golangci-lint` をインストールします
– `go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest`
2. リポジトリのルートに`.golangci.yml`を作成します。

### `.golangci.yml

元記事を表示

Go言語のContextについて:データ保管

# はじめに

[前の記事では](https://qiita.com/u-kai/items/8107b5231452e67a2004)Context のキャンセル機能に着目してまとめを行いました。本記事では Context のもう一つの目的であるデータ保管についてまとめます。

## 並行処理のデータ保管について

以下の例はクライアントから来たリクエストを様々なバックエンドに並行に送信を行っています。

“`go
func RegisterHandler(func(w http.ResponseWriter,r *http.Request)) {
requestId := getRequestId(r)
var wg sync.WaitGroup

wg.Add(1)
go func() {
defer wg.Done()
user := getUserFromRequest(r)
registerToDB(requestId,user)
}()

wg.Add(1)
go

元記事を表示

Go言語プロジェクトでの一般的なLinterエラーとその対処法

# **はじめに**

Go言語のプロジェクトでは、品質を保つためにさまざまなlinterツールが使われます。これらのツールは、コードの可読性を高め、潜在的なバグを早期に発見するのに役立ちます。しかし、これらのツールが出す警告やエラーに対処するのは時に難しいものです。この記事では、**`goimports`**、**`errcheck`**、**`gocognit`**、**`gocyclo`**などの一般的なlinterツールでよく見られるエラーと、それらを解決する方法について説明します。

## **目次**

1. goimportsに関するエラー
2. errcheckに関するエラー
3. gocognitに関するエラー
4. gocycloに関するエラー
5. まとめ

## **goimportsに関するエラー**

**`goimports`**はインポート文を整理し、フォーマットします。このエラーは、インポートが適切に整理されていない場合に発生します。

### **サンプルコード(lintエラーが出る)**

“`go
package main

import (

元記事を表示

GitHub Actionsによるユニットテストの自動化

## **はじめに**

近年、CI/CDの自動化はソフトウェア開発の重要な部分となっています。特に、品質を保証しつつ迅速に開発を進めるためには、自動化されたテストとそのカバレッジのチェックが不可欠です。今回は、Go言語を使用したプロジェクトでGitHub Actionsを利用してユニットテストを実行し、テストカバレッジをチェックする方法を紹介します。

## **GitHub Actionsによるユニットテストの自動化**

GitHub Actionsは、ソフトウェアのワークフローを自動化するための非常に強力なツールです。これを使用して、プルリクエストやコミット時に自動的にユニットテストを実行できます。

### **ユニットテストの設定**

以下は、Go言語のプロジェクトにおけるユニットテストのための基本的なGitHub Actionsワークフローの設定例です。

“`yaml
name: Unit Tests

on:
pull_request:
branches:
– main

jobs:
unit-tests:
runs-on: u

元記事を表示

Go言語のContext調べてみた:キャンセル機能について

# はじめに

最近 Go 言語を書いていて,よく Context に出くわしていました。

キャンセルや時間制限などを通知するための型ということはなんとなくわかっていたのですが、実践的な利用方法がいまいちわからないず、context。Background でいつも黙らせてきました。

ただ、このままでは何も学びがないかつ、まずいことをしているかもしれないと思い、Context について学んでみましたので、記事に残します。

思ったより長い記事になってしまったため、今回は Context の目的の一つである、**実行される並行処理をキャンセルする API の提供**に着目し説明します。

もう一つの目的である**データを渡すためのデータの置き場所の提供**という目的はまた今度別の記事を書こうかと思います。

## Go でよく見る Context

並行処理を行う想定がされる関数(I/O 処理など)の第一引数によく定義されています。

Context は標準パッケージ context 内に定義されている interface です。

以下の例は AWS の SDK ですが、第一引数に

元記事を表示

メモ:Go言語の学習

1. インデントはタブ文字
1. 公開される名前は大文字にする
1. 演算子の前後にスペースを入れない

1.初期化していない変数はその型のゼロ値で初期化される
1.`++`,`–`は演算子ではなくステートメントで、式の中で使えない

“` go
package main

import “fmt”

//mainはゴルーチンとして呼び出される
func main() { //funcと{は同じ行に書く。mainはパラメータや戻り値を持たない
//
}
“`

元記事を表示

【Golang】構造体をJSONにマッピングする際の挙動について

実務において、レスポンスとしてJSONを返却しているのですが、DBにないカラムを構造体に追加した状態でリリースするとレスポンスはどうなりますか?という質問を受けたため、これに回答するためにGolangの構造体がJSONにマッピングされる時にどういう挙動をするのか調べたため、備忘録として残すもの。

### 公開フィールドとして定義した場合
“`go
package main

import (
“encoding/json”
“fmt”
)

// User 構造体の定義
// フィールド名の最初を「大文字」で定義した場合は公開フィールドとなる。
type User struct {
Name string `json:”name”`
Age int `json:”age”`
Sex int `json:”sex”`
}

func main() {
user := User{
Name: “John Doe”,
Age: 25,
Sex: 1,
}

// User構造体をJSONにマーシャル
jsonData, err := j

元記事を表示

Rust vs. Go: Implementing a REST API in SQLite

Backend の開発言語選定について、現職では Go を推す声が強い。

なぜなら、現状の技術選定に、規律がないからだ。Java、Python、Ruby、PHP、Node.js、Go、Kotlin and more.

Web 業界では、Go が popular になっているし、現職の 2B・2C 向けサービスも Go を多く使っている。

僕個人として、Go を選択することに異論はない。

一方で、次を見据えて考えておく必要もある。

何が言いたいかというと、より最高な選択肢は何かを常に考えていきたい。思考停止は退化。

Rust について、
– tutorial
– gRPC
– Rust + Wasm + Cloudflare Workers
– REST

と続けてきて、syntax は身について来た。

より実践的な課題を解けるように実践を重ねていく。そして、AtCoder の algorithm 問題についても解いていく。

## 本題
今回も、REST + Database の API を Rust で実装し、それを Go で rewrite した。

database

元記事を表示

Go(Echo)+MySQLでCRUDを行えるAPIサーバをDocker上で構築する(2)APIサーバを構築する

# はじめに
Go(Echo)を用いたAPIサーバを構築したい方向けとなっております。
**前回:[Docker上でGo(Echo)+MySQLのAPIサーバを構築する(1)GoとMySQLを接続し、テーブルを作成する](https://qiita.com/Senritsu420/items/9a07c59a991d8e5042c4)**
この記事では、Go(Echo)を用いてAPIサーバを構築するまで説明します。
間違いや改善点などあればお気軽に仰っていただけると幸いです。

環境

Docker:v24.0.6
Docker Compose:v2.4.1
# 最終的な構成図
“`
.
├── docker-compose.yml
├── golang
│ ├── Dockerfile
│ └── app
│ ├── handler
│ │ └── handler.go
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ └── database

元記事を表示

Go(Echo)+MySQLでCRUDを行えるAPIサーバをDocker上で構築する(1)GoとMySQLを接続し、テーブルを作成する

# はじめに
Go(Echo)を用いたAPIサーバを構築したい方向けとなっております。
この記事では、Docker上でGoとMySQlを接続できる所まで説明しています。
間違いや改善点などあればお気軽に仰っていただけると幸いです。

環境
– Docker:v24.0.6
– Docker Compose:v2.4.1

# 最終的な構成図
“`
.
├── docker-compose.yml
├── golang
│ ├── Dockerfile
│ └── app
│ ├── go.mod
│ ├── go.sum
│ └── main.go
└── mysql
├── Dockerfile
└── .env
“`

# Docker ComposeでGoとMySQLを接続する
まず初めに、プロジェクト直下に`docker-compose.yml`を作成します。
“` docker-compose.yml
version: “3.8”
services:
go:
container_name

元記事を表示

SOF ファイルフォーマット リバエベース 解説

# 概要
Altera / Intel 製 FPGA のビットファイル(コンフィグレーションデータ)のフォーマットをリバエベースで解説する

本記事では確認できたことのみを述べるにとどまる
(不具合、故障等は責任を持ちません)

# 環境
Quartus Prime Lite 22.1
Ubuntu
FPGA : MAX10(10M25SAE144A7G)
実装回路:1 Hz Lチカ
# SOF と POF (多分)
現時点(23/11/09)では SOF と POF においてファイルフォーマットの違いは確認できなかった

### SOF : Sram Object File
FPGA の SRAM 部へ書き込む際に Quartus プログラマで使用する

#### POF : Programmer Object File
MAX 等の Flash へ書き込む際に Quartus プログラマで使用する

# フォーマット概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/f

元記事を表示

Go言語でテストコードを作ってみた[初歩の初歩]

## はじめに
この記事は、エンジニア成り立ての「見習いエンジニア」が作成した記事になります。記事の内容で間違っているとことがありましたらコメントでご指摘いただけますと非常に励みになります!

## テストコード作成の決まり
### その1『ファイル名』
Goのテストでは、ファイル名を以下のような記載にする必要があります。
“`go
xxx_test.go
“`

### その2『”testing”』パッケージ
そして、importに以下のように”testing”パッケージの記載が必要です。
“`go
import {
“testing”
}
“`

### その3『関数名は”func TestXxx(t *testing.T)”』
以上をまとめると以下のような記載になります。
“`go
// ファイル名 xxx_test.go

packege main

import {
“testing”
}

func TestXxx(t *testing.T) {
テスト内容
}
“`

:::note info
(t *testing.T)って

元記事を表示

swag: No such file or directoryとなった場合の対処法[WSL(ubuntu)]

## TL;DR
### ubuntuの場合
.bashrcを編集。
“`
vim ~./bashrc
“`
環境変数を登録
“` .bashrc
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
“`
編集後に更新をかける。
“`
source ~/.bashrc
“`

## 発生事由
swag コマンドは使えるが、makeコマンドでエラーが発生。

エラー理由を調べるために `which swag` でパスを読むと環境変数が存在しないことが判明した。

## 解決法
調べていくとキャッシュが悪さをしているようなので、`hash -r`でリセット。

また、VSCodeで作業していることも一因のようで、`go env`によるとパスは通っているが、ubuntu環境では通ってなかったので登録しました。

あとの詳しいことは下記参考記事を参照ください。

## 参考記事

bashでパスが通っているのにコマンドが見つからない(または、パスの順序と違うコマンドが実行される)場合の原因と対応


https://tech.librastudio.co.jp/entry

元記事を表示

[GCP] Vertex AI 機能x検証

# GCP Vertex AI

## 概要
GCPのVertex AIは、機械学習(Machine Learning)モデルの開発、トレーニング、配備を簡素化するためのクラウドベースのプラットフォームです。Vertex AIは、豊富な機能セットを提供し、機械学習ソリューションの開発を迅速かつ効果的に行うことができます。

## 機能

### モデルのトレーニングと予測

– Vertex AIは、大規模なデータセットを使用して機械学習モデルをトレーニングするための豊富なツールセットを提供します。
– トレーニングは、TensorFlow、PyTorch、XGBoostなどの一般的なフレームワークを使用して行うことができます。
– Vertex AIは、分散トレーニングをサポートし、スケーラビリティとパフォーマンスを向上させます。
– トレーニングされたモデルを使用して、新しいデータの予測を行うこともできます。

### モデルのデプロイと管理

– Vertex AIは、トレーニング済みモデルのデプロイと管理を簡単に行うことができます。
– モデルをデプロイする際には、スケーラブル

元記事を表示

OTHERカテゴリの最新記事