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

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

OPA・Regoでコーディング規約が守られている事を検査する

## 概要

チームやプロジェクトで独自に定めたコーディング規約が遵守されていることを確認するために、OPA・Regoを使ってコードを検査する。Golangでの実装を想定している。

## 仕組み

まず、検査対象のコードをASTに変換する。ASTは、抽象構文木のことで、コードの構造を表現したデータ構造のこと。ASTを使うことで、コードの構造をプログラムで扱えるようになる。
Regoで記述したコーディング規約をポリシーとして、ASTをインプットとしてOPAに渡すことで、コーディング規約に違反している箇所を検出することができる。

## goast

上記を簡単に実現するために、[goast](https://github.com/m-mizutani/goast)というツールを使用する。goastはユーザが定義したポリシーをもとに上記をまとめて行ってくれる。出力した結果に`pos`という名前でPos値を渡すことで、出力に違反しているコードを表示することもできる。

“`rego
res := {
“msg”: “fmt.Println is not allowed”,

元記事を表示

GolangとCasbinでABACを実装する

# はじめに
認可専用のライブラリである[Casbin](https://casbin.org/)を使って、[ABAC](https://en.wikipedia.org/wiki/Attribute-based_access_control)を実装してみる。Casbinでは、単純にルールを羅列するのではなく、[eval()という組み込み関数](https://casbin.org/ja/docs/abac#scaling-the-model-for-complex-and-large-numbers-of-abac-rules)を使用することで、任意の認可ロジックを簡潔に組み込むことができる。なお、CasbinそのものやRBAC/ABAC等の認可の概念に関する説明は本記事ではしない。

eval()では、[公式ドキュメントの例](https://casbin.org/ja/docs/abac/#scaling-the-model-for-complex-and-large-numbers-of-abac-rules)のように直接ロジックを渡すこともできるし、[`AddFunction

元記事を表示

Go:入門者向けにポインタをコードで解説

# はじめに
Go言語のポインタの概念が分かりづらく、理解に時間を要しました。
初心者は、**文章よりもコードを書いて動かしてみる方が理解が深まると思うので**、本記事のコードを参考にしてください!

# ポインタとは
ポインタは、ある値が格納されているメモリアドレスを保持する変数です。
ポインタを使用すると、直接そのメモリアドレスにアクセスして値を読み書きすることができます。
以下の演算子を使用して、ポインタを宣言します。

– &演算子:変数のメモリアドレスを取得します。
– *演算子:ポインタが指すメモリアドレスの値にアクセスします。

# 例:ポインタを使って値を変更する

“`go
package main

import “fmt”

func main() {
number := 10 // 整数変数の定義
fmt.Println(“元の値:”, number) // 元の値の出力
fmt.Println(“numberのアドレス:”, &number)

元記事を表示

Go言語 レシーバ

## レシーバとは
Go言語における「レシーバ (Receiver)」は、他の言語でよく見られる「this」や「self」といったキーワードに相当する。Goのメソッド内でレシーバを介して構造体のメンバー変数やメソッドにアクセスすることができる。

例えばjavaの場合、クラスのメソッド内でクラスのメンバー変数にアクセスするためには this キーワードを使用します。Goにおけるメソッドではレシーバがその役割を果たし、構造体のフィールドやメソッドにアクセスするために利用される。

## java / Go での比較

“`java:java
public class MyClass {
private int value;

public void setValue(int newValue) {
this.value = newValue; // “this”を使ってメンバー変数にアクセス
}
}

“`

“`go:go
package main

import “fmt”

type MyClass struct {
valu

元記事を表示

Goで学ぶGraphQLサーバーサイド(6)ーリゾルバの実装(応用編)1

こんにちは。

Part 6は「リゾルバの実装 – 応用編」についてです。

# この章について

「リゾルバの実装 – 基本編」にて実装を行った際には、GraphQLのスキーマで定義されたクエリ・ミューテーション1つに対してリゾルバメソッド1つが紐づいている状態でした。

– `user`クエリ: `*queryResolver型`の`User`メソッドを実行
– `repository`クエリ: `*queryResolver`型の`Repository`メソッドを実行
– `node`クエリ: `*queryResolver`型のNodeメソッドを実行
– `addProjectV2ItemById`ミューテーション: `*mutationResolver`型のAddProjectV2ItemByIDsメソッドを実行

この章ではリゾルバを分割することによって、この1:1対応を解消していきます。

# リゾルバを分割する前の状況確認

まずは、リゾルバ分割を行っていない状況ではどのような挙動をしているのか、もう一度確認してみましょう。
応用編では、`repository`クエリ

元記事を表示

Go:map型の変数にキーが存在するかどうかを判定

# はじめに
map型の変数にキーが存在するかどうかを判定するためのコードを作りました。
理解するのに役立つと思うので、「1. 判定処理、2. 実行結果」の部分を見てみてください。
それに続いて、「3. IF文を使った判定処理、4. 実行結果」のセクションでは、少し複雑なコードを紹介しています。

# 1. 判定処理
“`go
package main

import (
“fmt”
)

func main() {
seen := make(map[int]string)

// キー1に対して値を設定
seen[1] = “存在する1”

// キー2に対して値を設定
seen[2] = “存在する2”

// キー3は設定しない

// キー1の確認
value, exists := seen[1]
fmt.Println(“Key 1: Value =”, value, “/ Exists =”, exists)

// キー2の確認
value, exists = seen[2]
fmt.Println(“Key 2: Value =”, valu

元記事を表示

【メモ】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で作るクリーンアーキテクチャの自己解釈まとめ

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

## クリーンアーキテクチャの目的
# 設計思想
– 依存性逆転の原則(Dependency Inversion Principle): 高レベルのモジュールは低レベルのモジュールに依存すべきではなく、どちらも抽象に依存すべき。抽象は詳細に依存してはならない。
– 単一責任の原則(Single Responsibility Principle): 一つのクラスはただ一つの責務を持つべきであり、変更の理由は一つであるべき。

## メリット/デメリット
– 🙂 保守性向上: フレームワーク非依存で変更が容易。バグが発生しにくい構造を提供
– 🙂 テストが容易性: 機能を分割しドメインを区切ることでテスト、統合テストがしやすい
– 🙂 拡張性: 別のドメインとの間にインター

元記事を表示

アプリ開発で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

元記事を表示

OTHERカテゴリの最新記事