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

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

コンパイル型言語とは

# コンパイル型言語とは
人間が書いたソースコードを、コンピュータが分かるように機械語に変換(コンパイル)してからプログラムを実行する言語のこと。インタプリタ型言語とは違い、一度にすべてのソースコードを変換してから実行する。
(インタプリタ型言語は、ソースコードを一行ずつ実行してプログラムを実行する言語である)

### コンパイル型言語の例
Java, C#, Go

### インタプリタ型言語の例
JavaScript, Python, Ruby, PHPなど

元記事を表示

ユニクロのTシャツのコードを実行しようとしたら意図せずGO言語に入門した

# はじめに
ユニクロのバラエティゾーンで売ってるプログラムが書かれたTシャツありますよね。
そもそもGOで書かれているとすら知らなかったのですが、GOについて何も知らない状態から動かしてみました。
筆者は普段C#とPHPをメインに使用していて、GOは全くの素人です。
意図せずGOのHelloWorldみたいになったので記事にします。

とりあえず実行してみたい方は以下のレポジトリで実行できます。
Dockerが入っていればGOが入ってなくても動きます。

https://github.com/Pokeyama/uniqlo-tshirt-app

# シャツとコード
uniqlo-shirt.jpg

iPhoneで撮ると勝手にOCRして文字として読み取ってくれたので、そのままGPTに整形してもらっ

元記事を表示

WSL2にインストールしたtinygoでtinygo monitorをraspberry pi picoで実行

# WSL2にインストールしたtinygoでtinygo monitorを実行

どうしてもWSL2でtinygoを動かして、
rapberry pi pico相手に `tinygo monitor`を実行したかった。

備忘録としてメモをまとめる。

## 実行環境
– Windows 11
– WSL2 Ubuntu 22.04LTS
– golang 1.22.5
– tinygo 0.32.0

## 手順
### 1. golang, tinygoをインストール
### 2. ソースコードを作成
今回は下記 `sample.go`

“`golang
package main

import “time”

func main() {
for {
println(“hello world!”)
time.Sleep(time.Second)
}
}
“`

### 3.モジュール解決

`go mod init sample`
`go mod tidy`

### 4. コンパイル
`tinygo build -target=pico -o ./sample.

元記事を表示

【個人開発】趣味で作ったWebアプリをNext.js使ってリプレイスしたらページパフォーマンスが90くらいになった話

はじめまして!もんたです。

ちょこっと前に[もんたの森っていう個人開発のWEBアプリケーションをリリースした話](https://qiita.com/Maminumemonta0706/items/9e8632698fb6a8329b8c)をしたんですが、この記事では『そのもんたの森のリプレイス企画を実施したよ〜』って話をしようかと思います。

この記事を読んで僕と同じかけだしエンジニアの個人開発のモチベーションにつながれば幸いです!

あ、そういえばいろいろやらせてもろてます。
よかったら覗いてみてあげてください。

**【たまーに描いた絵をアップする X ( Twitter ) 】**

https://x.com/monta_no_mori

**【最近始めた Instagram 】**

https://www.instagram.com/monta_no_mori/

**【もんたのLINEスタンプ】**

https://store.line.me/stickershop/author/2887587/ja

## 今回作ったやつ

https://www.montano

元記事を表示

goでweb漫画のサイトをスクレイピングしてRSSを作成する

# 前説
– もともと PHPで自分の読んでいるweb漫画のサイトをスクレイピングしてRSSを作成するツールを作っていた
– https://github.com/background-color/webcomic-crawler
– 10年近く経ち、ライブラリも古くなってしまっていたので、Goで作り直すことにしました

# 仕様
– 巡回するURL,読み込むセレクタはDB保持する
– DBからURLを取得し、セレクタの情報を取得する
– 取得した情報は、前回取得した情報と異なればDBに保持する
– 同じ場合は保持しない
– 取得した最新情報はRSSファイルに出力
– RSSリーダーで読み込みたいため

# 開発
## スクレイピングライブラリ
### 要件
– クライアントサイドレンダリングのページも読み込めること
– セレクタを指定して要素が取得できること
– 現行の仕様をそのまま使いまわしたい

というわけで、 [go-rod/rod](https://github.com/go-rod/rod) を使うことに
### コードを書いて動作確認

`

元記事を表示

filepath.WalkDirでディレクトリ内を削除するときには注意

# やりたいこと
処理が終わった一時ディレクトリ内を綺麗したい。
でも、親ディレクトリは残しておきたい。
ディレクトリ内は階層が統一されていない。

## 削除したいディレクトリ構造

“`
.
├── parentDir1
│ ├── ChildDirA
│ │ └── ChildDirAA
│ └── ChildDirB
└── parentDir2
“`

## 試したこと
2つの方法で実施
* ReadDir
* filepath.WalkDir
filepath.WalkDirのほうが処理速度が早いという記事情報あり。

## ReadDirでディレクトリ内を取得

“`go
package main

import (
“fmt”
“io/ioutil”
“os”
“path/filepath”
)

func main() {
dir := “your_directory_path” // 対象のディレクトリパスをここに指定

err := removeSubdirectories(dir)
if err != nil {
fmt.

元記事を表示

GOジェネレータとクロージャについて基本

## ジェネレータ
ジェネレータとは、遅延評価によって値を生成する関数やメソッドのことを指す。ジェネレータは通常、データのシーケンスを逐次的に生成するために使用される。

ジェネレータの実装
GoにはPythonやJavaScriptのような組み込みのジェネレータ機能はないが、チャネルとゴルーチンを使ってジェネレータのような機能を実装することができる。

“`go
package main

import “fmt”

// ジェネレータ関数
func fibonacci() chan int {
ch := make(chan int)
go func() {
x, y := 0, 1
for {
ch <- x x, y = y, x+y } }() return ch } func main() { fib := fibonacci() for i := 0; i < 10; i++ { fmt.Println(<-f

元記事を表示

Go | errgroup.Group に至るまで

雑めも
– `errgroup.Group` を使っているけど、より原理的に書くとどうなるか整理
– 逆にいうと原理的に書くスタイルから、どうブラッシュアップされていくかみてみる

## `sync.WaitGroup`

– [Playgound](https://goplay.tools/snippet/BkUvjnk4s2S)
– 実行完了の制御として `sync.WaitGroup` を使う

“`go
package main

import (
“fmt”
“sync”
)

func main() {
var wg sync.WaitGroup // 実行完了の制御用

for i := range 5 { // 非同期N回実行
wg.Add(1) // increment
go func() {
defer wg.Done() // decrement
fmt.Printf(“i is %s\n”, i)
}()
}

wg.Wait() // wait
}
“`

## `sync.WaitGroup` + `chan` を使っ

元記事を表示

GoでgRPC API超入門

自分の中で少しずつ理解できてきたので、小分けにして整理していきたくこの記事を書きました。
同じ初学者のお役に立てれば。

::: note
当記事は実装メインで解説します。
protoって何の略?これは内部でどうなってるの?的な細かい話は省いています。
気になるところがあったら他記事で補完してください🙏
:::

## 構成
今回は最小限の超簡単な構成とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/f317ee38-fcdc-4807-dd65-089a1af1f128.png)
初学者はHello,World!を出力しなければならないという法律に則り、Hello,World!を出力するAPIを実装していきます。

実装では、クライアントのインスタンス、gRPCサーバのインスタンスをそれぞれ立ち上げ、リクエスト〜レスポンスまでの流れを確認する、ということをやります。

## 大まかな手順
ゆるふわ概念図を記しておきます。
### 全体像
まずは作成するものの全体

元記事を表示

GoとRedisで作る簡単従業員管理アプリ

# GoとRedisの勉強のために作りました

こんにちは!今回は、Go言語とRedisを使って、シンプルだけど便利な従業員管理アプリを作っていきます。プログラミング初心者の方も、ベテランの方も、一緒に楽しく学んでいきましょう!

## 1. 環境設定

まずは開発環境を整えましょう。GoとRedisをインストールして、必要なパッケージも用意します。

“`go
go mod init employee-app
go get github.com/go-redis/redis/v8
“`

これで準備オッケーです!さぁ、コーディングを始めましょう。

## 2. Redisクライアントの設定

次に、Redisに接続するためのクライアントを設定します。

“`go
package main

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

var ctx = context.Background()

func newRedisClient() *redis.Client {
return redi

元記事を表示

Go | 同じ名前の関数で引数の数を変える

雑めも

– https://xuri.me/excelize/en/sheet.html#SearchSheet を使ってて

`f.SearchSheet(sheet, kw, true)`

`f.SearchSheet(sheet, kw)`

が許容されてるのに気づいたのでメモ

## 末尾に1つ要素の有無をコントロールする

– [Playground](https://goplay.tools/snippet/qLiuZ23dLjM)

“`go
package main

import (
“fmt”
)

func main() {
// opt arg なし
fmt.Println(“>> no opt arg”)
f1(“:D”)
fmt.Println()

// false
fmt.Println(“>> false”)
f1(“:D”, false)
fmt.Println()

// true
fmt.Println(“>> true”)
f1(“:D”, true)
fmt.Println()

// invalid

元記事を表示

Go | Strategy + Null Object

## 雑めも
– ストラテジーパターン
– アルゴリズム(ストラテジー)を注入して使う。Excelストラテジー、PDFストラテジー、Nilストラテジーのどれか。
– それぞれのストラテジーごとに、構造体が違うため保持できるデータも異なる(`Excel.excel` と `Pdf.pdf` の箇所)

– Null Object
– Nilストラテジーは Null Objectパターンで、`nil` ではなくて処理をしない構造体を渡しておくと実行時に nil チェックが必要なくなる

– インジェクション
– ストラテジーを注入するタイミングがコンストラクタによる生成時かメソッドを実行時によってやり方が異なる

## ストラテジーパターン(コンストラクタインジェクション)

– [Playground](https://goplay.tools/snippet/pKsizrTUHne)

“`golang
package main

import “fmt”

func main() {
var ct Content

// Excel
ct = Content{

元記事を表示

Go | Union を Interface で実現する

最近はもっぱらGoを書いてるがメンタルモデルがTypeScriptに引きづられていたのでコード例を交えて比較して書いてみる。

## Go

– [Playground](https://goplay.tools/snippet/ETypdOB7qVv)
– Go らしくならInterfaceで実現する
– identifyなどのようにAやBごとのそれぞれの処理は、それぞれの構造体に対してメソッドを生やす形で実現する
– ダックタイピングなので、AとBはInterfaceのAorBのことを知らない。また、`echo(str string, aorb AorB)` の `aorb` は `AorB` のInterfaceを満たすものならA、B以外でも入れられる
– kind のように、AやBごとに必ず値を持っているものはInterfaceに`Kind`を定義してメソッドで実現する

“`go
package main

import (
“fmt”
)

func main() {
// a
a := A{IamA: “なんかの値A”}
echo(“A: “, a)

元記事を表示

[備忘録] Go CloudFunctionsでChain Middlewareを利用する

# Go CloudFunctionsでChain Middlewareを利用する

経緯

フト思った時に変態っぽいコードの書き方をしていたので、備忘録。

###### TL;DR

呼び出し元のfunctionsで、http.HandlerFunc(handler).ServeHttp(w, r)で実施する。

“`middleware.go
package middleware

import “net/http”

type Middleware func(http.Handler) http.Handler

func ChainMiddleware(h http.Handler, m …Middleware) http.Handler {
if len(m) < 1 { return h } wrapped := h for i := len(m) - 1; i >= 0; i– {
wrapped = m[i](wrapped)
}

return wrapped
}

func LoggerMiddleware(next http.Ha

元記事を表示

InteractionとWebhookでサーバレースなDiscord Bot作成

# InteractionとWebhookでサーバーレスなDiscord Bot作成
[Interaction](https://discord.com/developers/docs/interactions/overview)ベースのDiscord Botを作ってみていい感じだったのでメモします。

## Discord Bot の2種類の作り方
Discord Botはユーザからのイベントを受け取って何らかの動作を行いますが、そのイベントの受け取り方は2種類あります:
– WebSocket
– 人間のユーザと同じようにクライアント -> Discord へ接続します
– Botプロセスを常駐させる必要があります
– Webhook
– イベントが起こると Discord からあらかじめ定めたHTTPエンドポイント(Interaction Endpoint URL)へWebhookが飛びます
– リクエストベースで起動する Lambda や Cloud Run などのサービスと相性が良いです

WebhookはWebSocketベースのBotよりも受信できるイベン

元記事を表示

github.com/aws/aws-sdk-go-v2のEndpointが非推奨になっていた件

# 概要

新しいサービスを作るにあたってGo言語からR2に読み書きする必要があり、[github.com/aws/aws-sdk-go-v2](github.com/aws/aws-sdk-go-v2)を使ったS3クライアントの初期化処理を既存サービスから流用しようとしました。その際、`EndpointResolverWithOptionsFunc`などの関数がDeprecatedになっていました。

これについて言及している記事があまり無かったので、メモがてら記事にしてみました。

# 内容
調べたところSDKの[aws/endpoints.go](https://github.com/aws/aws-sdk-go-v2/blob/main/aws/endpoints.go)内の構造体や関数が非推奨になっていました。

`EndpointResolver`のインターフェース定義部分に以下のようなコメントがありました。

“`golang
// Deprecated: The global endpoint resolution interface is deprecated. T

元記事を表示

【Go言語】スキルチェックを解くための開発環境とコーディングの考え方

# 概要

コラボキャンペーンが面白そうなので、久しぶりにPaizaの問題を解いてみました。

せっかくなので、ローカルの環境でもテストができる環境構築も整え、解説してみようかと思います。
少し前まで、Paizaのエディターで直接書いて提出していました。もちろんテストなしでした(笑)

提出コードは Go言語を使用しています。(私の一番得意な言語なので)

## 想定する読者

– 就職活動でPaizaを利用している人
– エンジニアになってまだ経験が浅い人

## この記事の目的

– Paizaのスキルチェックを受け、エンジニアへの就職(転職)を成功させる

## この記事で解説すること

– 実務のコードと競技プログラミングのコードの考え方
– Paizaの問題をローカル環境で書いて試す

ローカルでの開発環境を整えることで、より効果的、効率的にPaizaのスキルチェックを受ける。
ただスキルチェックを受けるだけでなく、企業の目に止まりやすいコーディングができるようになる。
これらを目指して、就職(転職)を成功させてほしいと思います。

## この記事では解説していないこと

元記事を表示

goのエラーハンドリング

実用Go言語 第5章 エラーハンドリング より

### エラーハンドリングの基本
エラーハンドリングとしては多くの場合以下のような方針が考えられる。
1. 呼び出し元に関数の引数などの情報を付与してエラーを返す
2. ログを出力して処理を継続する
3. リトライを実施する
4. リソースをクローズする

Goではpanicを多用せずエラーハンドリングを行いエラーを返すべき。

### 呼び出し元に情報を付与して返す
エラーが発生した場合そのまま返していては発生個所の特定がむずかしいため、情報を付加して返す。
“`
user, err := getInvitedUserWithEmail(ctx, email)
if err != nil {
return fmt.Errorf(“fail to get invited user with email(%s): %w”, email, err)
}
“`

### ログを出力して処理を継続
ex. データベースに指定されたレコードが存在しないとデフォルトの値を用いて処理を継続するなど
“`
//func featchCap

元記事を表示

goのエラー作成

実用Go言語 第五章 エラーハンドリングよりメモ

goアプリケーションでエラーを作成する方法は大きく二つに分けられる。

1. 標準ライブラリの関数を使って作成
2. アプリケーション独自のエラー型を定義

### errors.new
もっともシンプルなエラー生成法。変数に保存すると区別してハンドリングしやすい。
“`
var ErrNotFound = errors.New(“not found`)
func findBook(isbn string) (*Book, error) {
return nil, ErrNotfound
}
“`

### fmt.Errorf
フォーマットされた文字列を元にエラーを作成
“`
func validate(length int) error {
if length <= 0 { return fmt.Errorf("length must be greater than 0, length = %d", length) } return nil } ``` ### 独自のエラー型

元記事を表示

gormを使ったクエリーのロギング

実用Go言語 9.9.4 クエリーのロギングより メモ

– 標準ライブラリのdatabase/sqlパッケージはロギングをサポートしていない
– サードパーティ側で用意されている場合積極的にライブラリ側のAPIを使うとよい

“`
newLogger := logger.New(
log.New(os.Stdout, “\r”, log.LstdFlags), //出力設定、改行方法、プロパティ
logger.Config{LogLevel: logger.Info}, //Silent, Error, Warn, Info がある
)

db, err := gorm.Open(sqlite.Open(“test.db”), &gorm.Config{Logger: newLogger})
if err != nil {
log.Fatal(err)
}
“`

※log.LstdFlags とは
logを yyyy/mm/dd HH:MM:SS で表示する。
他にもLmicrosecondsマイクロセカンド表示などがある

表示されたログ
“`

元記事を表示

OTHERカテゴリの最新記事