- 1. Go言語 レシーバ
- 2. Goで学ぶGraphQLサーバーサイド(6)ーリゾルバの実装(応用編)1
- 3. Go:map型の変数にキーが存在するかどうかを判定
- 4. 【メモ】Goの環境設定
- 5. Goで作るクリーンアーキテクチャの自己解釈まとめ
- 6. アプリ開発でGo言語を採用するメリット
- 7. reviveでカスタムLintルールを設定する方法
- 8. 技術書典って何だ?面白そう!出展しよう!ってなった話
- 9. distrolessの利用には依存関係に気をつけよう
- 10. ローカルとGitHub Actionsでのgolangci-lint 設定方法
- 11. Go言語のContextについて:データ保管
- 12. Go言語プロジェクトでの一般的なLinterエラーとその対処法
- 13. GitHub Actionsによるユニットテストの自動化
- 14. Go言語のContext調べてみた:キャンセル機能について
- 15. メモ:Go言語の学習
- 16. 【Golang】構造体をJSONにマッピングする際の挙動について
- 17. Rust vs. Go: Implementing a REST API in SQLite
- 18. Go(Echo)+MySQLでCRUDを行えるAPIサーバをDocker上で構築する(2)APIサーバを構築する
- 19. Go(Echo)+MySQLでCRUDを行えるAPIサーバをDocker上で構築する(1)GoとMySQLを接続し、テーブルを作成する
- 20. SOF ファイルフォーマット リバエベース 解説
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 mainimport “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 mainimport (
“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 mainimport (
“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 builderENV PROJECT xxx/xxxx/batch
WORKDIR /go/src/$PROJECT# restore dependencies
COPY go.* ./
RUN go mod downloadCOPY . .
RUN go build -o /batchFROM 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.WaitGroupwg.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 mainimport (
GitHub Actionsによるユニットテストの自動化
## **はじめに**
近年、CI/CDの自動化はソフトウェア開発の重要な部分となっています。特に、品質を保証しつつ迅速に開発を進めるためには、自動化されたテストとそのカバレッジのチェックが不可欠です。今回は、Go言語を使用したプロジェクトでGitHub Actionsを利用してユニットテストを実行し、テストカバレッジをチェックする方法を紹介します。
## **GitHub Actionsによるユニットテストの自動化**
GitHub Actionsは、ソフトウェアのワークフローを自動化するための非常に強力なツールです。これを使用して、プルリクエストやコミット時に自動的にユニットテストを実行できます。
### **ユニットテストの設定**
以下は、Go言語のプロジェクトにおけるユニットテストのための基本的なGitHub Actionsワークフローの設定例です。
“`yaml
name: Unit Testson:
pull_request:
branches:
– mainjobs:
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 mainimport “fmt”
//mainはゴルーチンとして呼び出される
func main() { //funcと{は同じ行に書く。mainはパラメータや戻り値を持たない
//
}
“`
【Golang】構造体をJSONにマッピングする際の挙動について
実務において、レスポンスとしてJSONを返却しているのですが、DBにないカラムを構造体に追加した状態でリリースするとレスポンスはどうなりますか?という質問を受けたため、これに回答するためにGolangの構造体がJSONにマッピングされる時にどういう挙動をするのか調べたため、備忘録として残すもの。
### 公開フィールドとして定義した場合
“`go
package mainimport (
“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