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

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

UTアカマイTシャツのGo言語コードを解読してみた

# はじめに
都知事選である。祭りである。
Qiitaに生息するIT関係者、エンジニア界隈として最も注目されているのは安野貴博候補であろう。

安野たかひろ(東京都知事候補)公式ホームページ

https://takahiroanno.com

その安野候補がよく着用している服はUNIQLOのアカマイ・テクノロジーズ社コラボUT。

https://www.uniqlo.com/jp/ja/products/E459561-000/00?colorDisplayCode=09&sizeDisplayCode=004

>アカマイ・テクノロジーズ
>
>クラウドカンパニー / 1998年に設立されたAkamai Technologies, Inc.は、オンラインライフの力となり、守るクラウドカンパニーです。世界の先進企業が Akamai を選び、安全なデジタル体験を構築して提供することで、Akamai は、毎日、世界中の人々の生活、仕事、娯楽をサポートしています。超分散型のエッジおよびクラウドプラットフォームである Akamai Connected Cloud は、アプリと体験をユーザー

元記事を表示

Go言語の特徴

# はじめに
ソフトウェア開発の世界には、多くのプログラミング言語があります。
Python、JavaScript、C、Ruby、最近ではRustやKotlinなど、それぞれ特徴があります。
様々なプログラミング言語に触れてきました。その中でも私が特に印象に残っているGo言語について解説したいと思います。
# Go言語とは
“**Go**”という名前にもあるようにGoogleが開発した言語です。
2009年に発表され、現在では様々なサービスに利用されています。[^1]
日本のサービスだと、メルカリやクックパッドなどがあります。
![スクリーンショット 2024-06-06 160725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809382/2075dcef-9ad5-e3ed-9f04-dfe5fde9b159.png)
# 特徴
特徴は大きく分けて3つほどあります。後ほど順に解説します。
* コンパイラ型
* 記述がシンプル
* 未使用の変数、モジュールはエラーになる

## コンパイラ型

元記事を表示

【個人開発】読みたい記事をストックするLINE Bot作ってみた

## はじめに

この度「あとで読むゼッタイ君」というLINE Botを個人で開発し、リリースしてみました。
その機能の紹介や技術的な話、感想等をつらつらと書いていきたいと思います。

ちなみに「あとで読むゼッタイ君」は、[こちらのリンク](https://lin.ee/WvHi3bx) or 以下のQRコードから友達追加が可能なので、ぜひ使って頂けると嬉しいです!

![あとで読むゼッタイ君.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526830/49daa827-b910-b19c-392c-eea1ffb375ca.png)

## どんなアプリ?

後で読みたいなーと思ったWebページを管理(登録・閲覧・削除)できるだけの超絶シンプルなLINE Botです。
具体的には、ユーザーが送ったメッセージ内容に応じて、以下の機能が利用できます。

– URLのみを送信すると、後で読みたい記事(WebページのURL)をブックマークとして登録できる
– 「読む」というメッセージを送信すると、ブックマー

元記事を表示

ドラ🔵もんで依存性の注入と依存性逆転の原則を理解する!!

# はじめに

依存性の注入(Dependency Injection, DI)は、習得するのは難しいですが、理解すると簡単にできるようになります。また、依存性の注入と間違えやすい概念として、SOLID原則の一つである依存性逆転の原則(Dependency Inversion Principle, DIP)があります。

今回は、依存性の注入と依存性逆転の原則という概念をドラ🔵もんで分かりやすく解説したいと思います。

ちなみにスライドもあります。(スライドにはコード例は載ってません)

# 依存性の注入(DI)

## DIをドラ🔵もんで解説する

の○太はドラ🔵もんに依存しています。ドラ🔵もんを他のロボットに変えるとの🟡太は死にます。生死がドラ🔵もんにかか

元記事を表示

【Golang入門】Gemini APIをGoで呼んでみた

OpenAIのAPIをコネコネやるのが流行っているようです。それに変な対抗意識を持って、あえてGeminiAPIを使ってGolangコネコネしてみました。3Gということ(勝手に私が言ってるだけです)でGCPにデプロイしようかなと思っていたりいなかったり。

そんな備忘録として書いておきます。

なお、実装についてはこちらを参考にしました。
とてもわかりやすいです。

またしっかりチュートリアルも用意されているため、このチュートリアルも参考にしても良いかと思います。

https://ai.google.dev/gemini-api/docs/get-started/tutorial?lang=go&hl=ja#set-up-api-key

## Geminiって?

一応Geminiについて軽く説明させていただきます。

Geminiとは、Googleの生成AIサービスです。Geminiは2023年12月に高性能AIモデルとして発表され、現在では以下の3つのモデルが存在します。

### Gem

元記事を表示

GitHub Actions で Go のテスト実行

CI の一環として、GitHub のデフォルトブランチに PR を作成した時と、マージをした時に UT を行う GitHub Actions を作成します。

### ファイル構成
“`
.github
  ├─ actions
  │ └─ go-ut
  | └─ action.yml
  └─ workflows
  └─ ci.yml
json
  ├─ go.mod
  ├─ go.sum
  ├─ pretty_print.go
  └─ pretty_print_test.go
.gitignore
“`
最終的にはリリースも GitHub Actions から行うため、UT の実行は action.yml に記載しています。
今回は、Go 言語の UT を対象にしており、json フォルダの下にコードおよび、テストコードが置かれています。

### Action
“` .github/actions/go-ut/action.yml
name: Go UT
description: Run go unit test

inputs:
g

元記事を表示

global-bundle.pemを使用しているのにfailed to verify certificate: x509: certificate signed by unknown authorityが出る

## TL;DR
使ってる`global-bundle.pem`が古かったです。
再度以下から取得しなおしたら解決しました。
https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

## 検証方法
RDSの認証機関に`rds-ca-rsa2048-g1`を使用しています。
そこで、`RDS Root 2019 CA`が含まれているかを確認します。
以下を実行して、何も出力されなければダメです。

### Javaのランタイムがこちら
“`console
keytool -printcert -v -file global-bundle.pem | grep -A2 “RDS Root 2019 CA”
“`

### Go langでやりたい方はこちら
“`go:main.go

package main

import (
“crypto/x509”
“encoding/pem”
“fmt”
“log”
“os”
“strings”
)

func main() {
pemData

元記事を表示

Go: ヘッダーを考慮した csv ファイルの読み込み

こちらのプログラムを[リートン](https://wrtn.jp/)で変換しました。
[Python3: ヘッダーを考慮した csv ファイルの読み込み](https://qiita.com/ekzemplaro/items/aabc6e3b9ac71e242d06)

## プログラム

“`go:csv_header.go
package main

import (
“encoding/csv”
“encoding/json”
“fmt”
“os”
)

func main() {
if len(os.Args) < 3 { fmt.Println("Usage: go run csv_to_json.go “)
return
}

inputCSVFile := os.Args[1]
outputJSONFile := os.Args[2]

// Open the CSV file
csvFile, err := os.Open(inputCSVFile)
if err !=

元記事を表示

【Go言語】go run main.goを使うな

# はじめに

一番初歩的な話ですが、海外の記事で話題になっていたのでまとめました。

# 結論

`go run main.go` より `go run .` を使いましょう。

# なぜ`go run .`の方がいいのか?

`go run main.go`だと、以下のようにmainパッケージが2つに分かれているとコンパイルエラーになる可能性がある。あと、短い。

“`go:main.go
package main

func main() {
hello()
}
“`

“`go:hello.go
package main

import “fmt”

func hello() {
fmt.Println(“Hello!”)
}
“`

“`shell-session
$ go run main.go
# command-line-arguments
./main.go:4:2: undefined: sayHello
“`

`go run .`を使うと、正しく実行される。

“`shell-session
$ go run .
Hello!
“`

ファイ

元記事を表示

Intellij IDEAでtypo検出の緑の波線を消す方法

## 症状

![スクリーンショット 2024-06-23 14.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172801/2b43ba70-e7ae-bbd5-4011-3902661687c2.png)

邪魔ですね。

## 対策

Settings(command + ,) → Editor → Inspections → Proofreadingのチェックを外せばオーケーです。

![スクリーンショット 2024-06-23 14.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172801/f0129423-e192-6e8f-be4f-7b3011534982.png)

![スクリーンショット 2024-06-23 14.33.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172801/

元記事を表示

Cloud Run + Gorm + Cloud SQLで詰まった

## 前提
`Go` + `Echo` + `Gorm`で作成したWebアプリを`Google Cloud Run`にデプロイしました。その際に、`Cloud SQL`との接続に詰まりました。

## 詰まったところ
### DB接続
DBが中々接続できずに公式ドキュメントを読みましたが、
https://cloud.google.com/sql/docs/mysql/samples/cloud-sql-mysql-databasesql-connect-connector?hl=ja
以下の2つのライブラリを用いるものでした。
“`go
import (
“cloud.google.com/go/cloudsqlconn”
“github.com/go-sql-driver/mysql”
)
“`
私の場合には`Gorm`のSQLドライバーを使っていたので、大幅な改修が必要そうなこの方法を回避したかったので調べてみると以下のページに解決方法が載ってました。
https://qiita.com/sky0621/items/d91ffd1faf63dbf34e77
g

元記事を表示

missing go.sum entry for module providing package github.com/golang/protobuf/proto (imported by github.com/gin-gonic/gin/binding); to add: の解決

# エラー内容

C:\Users\user\go\pkg\mod\github.com\gin-gonic\gin@v1.7.7\binding\protobuf.go:11:2: missing go.sum entry for module providing package github.com/golang/protobuf/proto (imported by github.com/gin-gonic/gin/binding); to add:
go get github.com/gin-gonic/gin/binding@v1.7.7
C:\Users\user\go\pkg\mod\github.com\gin-gonic\gin@v1.7.7\binding\yaml.go:12:2: missing go.sum entry for module providing package gopkg.in/yaml.v2 (imported by github.com/gin-gonic/gin/binding); to add:
go get github.com/gi

元記事を表示

【Go言語】ビルドタグgo:buildの使い方

# ビルドタグとは

ビルドタグとは、Goファイルの先頭にある特別なコメント。ビルドタグの後には1行の空行が入る。*Build Constraints* とも呼ばれる。ちなみに、`//`と`go`の間にスペースを入れると普通のコメントとみなされる。

“`go
//go:build foo

package hoge
“`

:::note
Go1.17以前では `//go:build` ではなく、 `//+build`が使えわれていました。
:::

## なんのためにビルドタグを使うのか

– [ビルドタグとは](#ビルドタグとは)
– [なんのためにビルドタグを使うのか](#なんのためにビルドタグを使うのか)
– [ビルドオプションの指定](#ビルドオプションの指定)
– [テストの分類](#テストの分類)
– [参考文献](#参考文献)

以下のようにすると、cgoが有効な場合にのみソースファイルを含む。

“`go
//go:build cgo
“`

## ビルドオプションの指定

例えば、以下のように **windows** を指定すると、window

元記事を表示

Goのbuildtinをサクッとリードしてみる。

builtin.goはGolangのリポジトリの`src/builtin/builtin.go`に書かれている。

このファイルにはGoで使われる定数、type、関数が定義されている。

当たり前に使っている定数や関数がどのように定義されているかをいくつか見てみましょう。

## bool

Goにおけるbool型は`true`と`false`の2つの値を持つ。

それぞれは`true`と`false`という定数で定義されている。

“`go
const (
true = 0 == 0 // Untyped bool
false = 0 != 0 // Untyped bool
)
“`

(VSCodeのGoの拡張機能で`true`と`false`にホバーするとこの定義に飛べて、初めて見たときは驚いた)

## make

makeは以下のように定義されている。

“`go
func make(t Type, size …IntegerType) Type
“`

makeはslice、map、channelに対しするメモリの確保を行う。

Ty

元記事を表示

golangci-lint(gci)を使ってGoコードをチェックしよう

### はじめに

Go言語の静的解析ツールであるgolangci-lint(gci)は、コードの品質を向上させるために役立ちます。この記事では、gciの基本的な使い方と、実際のコード例を通じてどのように役立つかを紹介します。

### gciのインストール

まずは、gciをインストールします。Windowsでのインストール方法は以下の通りです。

1. **Chocolateyを使用してインストールする方法**:

管理者権限を持つ PowerShell で以下のコマンドを実行します。

“`powershell
powershellコードをコピーする
choco install golangci-lint
“`

インストールが完了したら、次のステップに進みます。

### gciの基本的な使い方

1. **コードの静的解析**:

gciを使ってコードの静的解析を行います。

“`powershell
powershellコードをコピーする

元記事を表示

Goのクリーンアーキテクチャ振り返り

# はじめに
こんにちは!

2012年にGoがリリースされてから、2024年時点で12年。
基礎となるクリーンアーキテクチャについて、簡単に振り返ってみます。

### 1. なぜクリーンアーキテクチャが必要なの?

これを疑問に感じた方は、少なくないはず。

構造をそこまで意識する必要があるのか?

比較的小規模なプロダクトであれば、そんなに意識しなくてもいいと思います。
マイクロサービスとして活用している場合など、なおさら感じるのではないでしょうか。

しかし、比較的大規模なサービスなどで機能が増えて大きくなっていくと、変更が難しく、新しい機能を追加するのも大変になってきますね。

そこで登場するのが「クリーンアーキテクチャ」です。

クリーンアーキテクチャは、プログラムを役割ごとに整理することで、

* **変更に強くなる**
* **テストしやすくなる**
* **チーム開発がスムーズになる**

などのメリットがあります。

機能が増えていく前提で考えると、分かりやすいかもしれませんね。

### 2. 玉ねぎ🧅で理解するクリーンアーキテクチャ

クリーンアーキテクチャは、

元記事を表示

GoのNamed Return Valueとそのうまい使い方

Goには関数/メソッドを定義する時に返り値を名前をつけて関数の内部で初期化することなく変数を作ることができる仕組みがある。

これをNamed Return Valueと言う。

本記事ではNamed Return Valueのメリットデメリットと使い所を解説していく。

## Named Return Value

こちらにかかれている。

https://go.dev/doc/effective_go#named-results

参考のコードは以下のようになる。

“`go
func sampleNamedReturnValue() (value int) {
value = 2
return
}
“`

この返り値valueはint型で扱われ、ゼロ値(intでは0)で初期化される。

また関数内ではreturnだけ書くことでvalueにセットされている変数を返すことができる。

### メリット

個人的には2つあると考えている。

– 命名から返り値が何かが予測しやすい
– 少し短く書ける

まず命名については言うまでもなく、返す値がどのような役目をするの

元記事を表示

【Go】スライスはちゃんと理解しておかないと危険だよという話

# はじめに
どうもODです。
転職でWEBバックエンド開発を始めて約3ヶ月、これまで存在や概念だけは知っていたような技術のオンパレードでドタバタしております。
今回は業務でもよく登場するスライスのことについてお話ししようと思います。

# スライスとは
まずGo言語には`配列`と`スライス`の2つがあります。
どちらとも同じ型の複数の要素をまとめるためのものですが、
* 配列(array):固定長
* スライス(slice):可変長

と言う違いがあります(とんでもなくざっくりした説明ですが…)
私は処理の中で要素数が固定であれば配列を、変わりそうであればスライスを使う、といった具合に使い分けをしております。

# スライスの定義
Goにおけるスライスの定義は下記の通りになっています。
“`Go
type slice struct {
array unsafe.Pointer
len int
cap int
}
“`
https://go.dev/src/runtime/slice.go
つまり、スライスは内部的に配列(基底配列)を参照するもの、ということです。

元記事を表示

[Go] 自分専用のAIチャットボットサイト

# はじめに
皆さん、こんにちは!
AIチャットボット、どんどん進化してますね。
今回は、Go言語を使って、自分だけのAIチャットボットを作成・管理できるWebアプリを作ってみました。

# 完成イメージ
最初に完成イメージを載せてた方が分かりやすいですよね。
(今度からそうしよう)

# 要件
– 役割を設定したAIを複数作ることができる
– 入力欄にプロンプトを入力して「Run」ボタンをクリックすると、AIが回答を生成する
– 履歴は画面中央に表示され、スクロールする

# 技術スタック
– Go: 軽量かつ高速なプログラミング言語
– Gin: GoのWebアプリケーションフレームワーク / 今回はテンプレートを使います
– Tailwind CSS: utilityファーストなCSSフレームワーク
– Op

元記事を表示

GoでRedisを使ったときの基本の備忘録

本記事は業務で利用したGoとRedisを使ったときの備忘録です。

AWSのElaticacheを使い、GoのRedisクライアントは`github.com/go-redis/redis/v8`を使うのが一般的のようだったのでその使い方をまとめる。

(Get、Setの基本のみ書くため、詳細は公式ドキュメントを参照してください)

## GoでRedisを使う

大まかな流れは

1. Redisクライアントを作成
1. Redisの操作

という超シンプルな流れです。

### Redisクライアントを作成

go-redis/redisのクライアントを作成するには、`NewClient`を使います。

“`go
import (
“context”
“fmt”
“github.com/go-redis/redis/v8”
)

func NewRedisClient() *redis.Client {
rdb := redis.NewClient(&redis.Options{
Addr: “localhost:6379”,

元記事を表示

OTHERカテゴリの最新記事