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

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

VSCode gopls client: couldn’t create connection to server.の解決法

表題にあるエラーでめちゃくちゃハマったので、解決策を残します。

“`bash
[Error – 10:13:34 PM] gopls client: couldn’t create connection to server.
Message: Pending response rejected since connection got disposed
Code: -32097
[Error – 10:13:35 PM] The gopls server failed to initialize.
[Error – 10:13:35 PM] gopls client: couldn’t create connection to server.
Message: Pending response rejected since connection got disposed
Code: -32097
Error starting language server: Error: Pending response rejected since connection go

元記事を表示

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

こんにちは。

Part 7も「リゾルバの実装 – 応用編」についてです。
今回はリゾルバ分割の実装と動作確認について説明いたします。

#リゾルバ分割の実装

リゾルバを分割していない今の状況ではどのような不具合があるのかを確認できたところで、いよいよ分割実装をしていきましょう。

## `gqlgen.yml`に分割設定を記述

リゾルバを分割する設定は、`gqlgen.yml`に記述します。

“`gqlgen.yml
models:
+ Repository:
+ fields:
+ owner:
+ resolver: true
+ issue:
+ resolver: true
+ issues:
+ resolver: true
+ pullRequest:
+ resolver: true
+ pullRequests:
+ resolver: true
“`

今回の分割の方針は「`repository`クエリを実行して得られた`Repo

元記事を表示

ゴールーチンのメモ(チャネルなど)

## Goroutineとは
Goroutineとは、goのステートメントで、関数を指定することによって並行実行されるもの。

“`go
package main

import (
“fmt”
“time”
)

func main() {
go goroutine(“Hello!”)
hoge(“World!”)
}

func goroutine(s string) {
for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func hoge(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } > World!
> Hello!
> Hello!
> World!
> World!
> Hello!
> Hello!
> World!
> Hello!
> World!
→ 並行で実行したため、表示される順番がバ

元記事を表示

【永久保存版】0からGo言語を勉強するならこのロードマップに従え!

![bandicam 2023-11-14 18-39-01-453.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/0372d1bc-04dc-e94f-e5ff-4a3f721667dd.jpeg)

# はじめに

こんにちは!!@Sicut_studyです!

今回は**Go言語**の個人的に良かったと思った学習方法を**Go言語を学ぶための最速ロードマップ**として記事にまとめていきます!

つい先日**技術書典**があり、改めて**Go言語**が注目されているというのを再実感しましたので記事を書くなら**今だ!!**と思いました

過去にも**0からロードマップシリーズ**は書いていますので参考にしてみてください

https://qiita.com/Sicut_study/items/78910cd8d103b8d45a73

https://qiita.com

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事