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

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

Goの簡易文付きif文について

# Goの簡易文付きif文についての個人的な考察

Goでは、簡易文付きif文を使用することで、エラーハンドリングをより簡潔に書くことができる
しかし、個人的には早期リターンを用いた従来の書き方の方が可読性が高まると考える

## 書き方
ReadAlbumTitle関数からの戻り値(album構造体とerror)を処理する例

“`golang:簡易文付きif文
if album, err := ReadAlbumTitle(file); err != nil {
return err
} else {
albumList = append(albumList, album)
}
“`

“`golang:従来の書き方(早期リターン)
album, err := ReadAlbumTitle(file)
if err != nil {
return err
}
albumList = append(albumList, album)
“`
## 可読性
・簡易文付きif文で

元記事を表示

Goでスクレイピングをやってみる

みなさんスクレイピングを知っていますか?

スクレイピングとは、webサイトのHTML要素をプログラムを使って取得することです。

今回は、以下のスクレイピング練習サイトでGoの`colly`というライブラリを使って、スクレイピングを行ってみました。

https://books.toscrape.com/

# スクレイピングを行う際の注意事項
スクレイピングは、注意して行わないと違法になる可能性があります。
今回、自分が調べられる範囲で注意しなければならないことを調べてみました。

### まず利用規約を確認する
利用規約には、スクレイピングを禁止しているサイトがいくつかあるそうです。
例えば、`Amazon`の利用規約には以下のような文言があります。
>この利用許可には、アマゾンサービスまたはそのコンテンツの転売および商業目的での利用、製品リスト、解説、価格などの収集と利用、アマゾンサービスまたはそのコンテンツの二次的利用、第三者のために行うアカウント情報のダウンロードとコピーやその他の利用、データマイニング、ロボットなどのデータ収集・抽出ツールの使用は、一切含まれません。

元記事を表示

バックスラッシュエスケープされたタブ区切りテキストをCSVに変換する

以下サンプル

“`tsv2csv.go
//usr/bin/go run $0 $@ ; exit
package main

import (
“bufio”
“encoding/csv”
“fmt”
“os”
“strings”
)

func main() {
// 標準入力からデータを読み込む
scanner := bufio.NewScanner(os.Stdin)

// CSVライターを作成し、標準出力に書き込む
writer := csv.NewWriter(os.Stdout)
defer writer.Flush()

// 標準入力を1行ずつ読み込み
for scanner.Scan() {
// タブ区切りでフィールドを分割
line := scanner.Text()
fi

元記事を表示

初心者向けGo言語入門講座。今日から開発したい方向け

# Go言語入門講座

## Chapter 1: Go言語の紹介
Goは、Googleによって開発されたオープンソースのプログラミング言語で、シンプルで効率的なコードを書くことができます。Goの特徴や利点について説明します。

## Chapter 2: 開発環境のセットアップ
Goのインストール方法と開発環境のセットアップについて説明します。Goの公式サイトからダウンロードし、インストールします。

“`bash
# macOSの場合
brew install go

# Windowsの場合
# Goの公式サイトからインストーラーをダウンロードして実行
“`

## Chapter 3: Goプログラムの基本構造
Goプログラムの基本構造を学びます。`main`関数と`package`宣言について説明します。

“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello, World!”)
}
“`

## Chapter 4: 変数と定数
Goでの変数と定数の宣言方法を学びます。型推論と型指

元記事を表示

Docker 環境と Go Gin で最小 API を実装する:MongoDB

# Docker 環境と Go Gin で最小 API を実装する:MongoDB

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 24.04 で Go Gin Web アプリケーションを作成し、最小限の REST API を実装する方法を紹介します。
![gin_and_mongodb_on_docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/7c454da9-77e3-ef2a-7052-6019a0146e32.png)

## 目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

https://qiita.com/studio_meowtoon/items/6119ab05d8b13527efd8

## 実現すること

ローカル環境の Ubuntu の Docker 環境で、Dockerfile からビルドした Go Gin サービスのカスタムコンテナーと Mongo

元記事を表示

go-mysql-serverを使ってテンポラリなDBを立ち上げてテストを行う

最近、新しいプロジェクトで、久しぶりにGoを書いています。

DBを使ったコードのテストをしたいという要求が自分の中にあってどうしようかなと考えたところ、[go-mysql-server](https://github.com/dolthub/go-mysql-server)を使ってみることにしました。
dockertestやtestcontainersとかもあるよう(参考: [紹介記事](https://zenn.dev/jy8752/articles/419ab77b2b6a61))ですが、こっちのが速いかなというただの印象で、使うことにしました。後々dockertestやtestcontainersも使えるようにしても良いかなとは思ってはいます。

なお、本当のMySQLではないので、[制限](https://github.com/dolthub/go-mysql-server?tab=readme-ov-file#limitations-of-the-in-memory-database-implementation)はあります。
制限の簡単な訳と使ってみての追加(最後の2つ)

元記事を表示

自分がよく個人開発で使うターミナルコマンドまとめ(フレームワークなど)

## はじめに
初めましての人もそうでない人もこんにちは!
今回は自分がよく使うターミナルコマンドをまとめたいと思います!

皆さんは個人開発をよくしますか?
自分はコミュ障なのでなかなかチーム開発の機会なんてほとんどありません

まぁ自分がコミュ障なのは置いておいて個人開発する時って大抵Reactを使うためにnpx・・・と長いコマンドを使ったりしてませんか?

そんな長いコマンドを毎回のように入力することが大変面倒でChatGPTとかに毎回教えてもらっています!

コマンド用のテキストファイルを作成しましたが毎回のようにローカルファイルの海に漂っています・・・

なので今回は主に自分用という部分が大きいですが、皆さんにも共有できたらと思いこの記事を作成しました!

## React + TypeScript
“`
npx create-react-app frontend –template typescript
cd frontend
npm start
“`

## venv + Python
### MacOS/Linuxの場合
“`
python -m venv ve

元記事を表示

Goのモックライブラリを比較検討する

# 概要
Goのモックライブラリはいくつか存在しており、検討を始めるにあたって [Comparison of golang mocking libraries](https://gist.github.com/maratori/8772fe158ff705ca543a0620863977c2#user-content-fn-12-14e5dadb9d5bbfc4c34632f365c8a95b)の内容が大変参考になった。

このうち候補として考えた gomock, mockery, moq をそれぞれ使ってテストコードを書いてみた所感を元に、比較検討した結果をまとめる。

# はじめに:なぜモックライブラリが必要なのか
Goのテストコードで依存するインターフェースをモックする時、モックライブラリを使わずとも自前でモックを実装することは可能である。
例えば、以下のような `GetUserService.Get()` のテストコードを考えてみる。

“`go
type UserRepository interface {
GetUser(userId string) (User, er

元記事を表示

初めてGo言語をやってみて分かったこと。

# C言語と最近のモダンな言語(Java、C#、Pythonなど)のいいとこ取りをした感じ

* C言語的要素

基本的にGo言語はコンパイラ言語であり、ビルドを実行すると機械語に変換されるのですが、
機械語は直接CPUに命令を出す形式なので、めちゃくちゃ動作スピードが早いです。
コンパイラ言語はGo言語以外に、C言語、C++、Rust等があります。

また、Go言語はクラスという概念は存在しないので(似たようなパッケージという概念はありますが)、
その点も同じと言えます。

* Java的要素

モダンな言語だと、C言語には無かったListのような、要素を自由に追加削除できるるような仕組みがあります。
最近の言語だから、こういった仕組みなども扱えるようになっています。

また、例外処理(try-catch)のような仕組み(panic-recover)も用意されています。

* Python的要素

Pythonのようなスクリプト言語はソースファイルをあれこれ変換しなくてもすぐに実行できるのが特徴ですが、Go言語もいちいちビルドする必要は無く、ソースコードの状態のままで実行できるオプシ

元記事を表示

Goのネットワークプログラミングでよくあるエラーのbroken pipeを深く理解するために

Goでネットワークアプリケーションを開発する際、時々「broken pipe」というエラーに遭遇することがあるでしょう。この記事では、このエラーの意味を説明して、再現するためのコードを示して、基本的な対処法をいくつか紹介します。

「broken pipe」は通常、**(通信している同士の一方が)相手がリセットした(RST)TCPコネクション**にデータを書き込もうとしたときに発生する。このエラーは以下のコードで再現できる。

“`go
// …
var done = make(chan struct{})

func server() {
listener, err := net.Listen(“tcp”, “:8080”)
if err != nil {
log.Fatal(err)
}
defer listener.Close()

done <- struct{}{} conn, err := listener.Accept() if err != nil { log.Fatal("S

元記事を表示

CloudBuildでgolangci-lintを実行する

## 結論
`cloudbuild.yaml`に以下を追加すれば、実装できます

“`yml: cloudbuild.yaml
steps:
# golangci-lintのDockerイメージを指定する
– name: ‘golangci/golangci-lint’
# デフォルトの設定でgolangci-lintを実行する
args: [‘golangci-lint’, ‘run’]
“`

## golangci-lint[^1]とは
[^1]: https://github.com/golangci/golangci-lint

> `golangci-lint` is a fast Go linters runner.
>It runs linters in parallel, uses caching, supports YAML configuration, integrates with all major IDEs, and includes over a hundred linters.

`golangci-lint`は高速なGoリン

元記事を表示

entでeager_loadingを実装する

# 書くこと
– GolangのORMであるentでEager Loadingを実現する方法
– INNER JOIN、LEFT JOINなど
– 他テーブルのWHERE、ORDERなど
– 他テーブルのデータの取得はPreloadになってしまう

# 書かないこと
– テーブルの定義方法
– schemaの書き方

# なぜ記事を書いたか
– INNER JOINやLEFT JOINの方法が書かれている記事や公式が少なく、自分で色々試して知見が深まったため

# 参考文献
https://entgo.io/ja/docs/predicates/

# JOINの行い方
## ER図
“`mermaid
erDiagram
organizations ||–o{ users : has
organizations {
int id
string name
}
users {
int id
string name
int organization_id
}
“`

## Source
“`golang
import (
ent

元記事を表示

C# -> Golang

# 目次

# まえがき
C#使いがGo言語に移行するときに役立ててほしいと思い書きました。

C#についての詳しい説明は割愛します。

# 言語概要

– Google が開発したプログラミング言語です。「**Go言語**」や「**Golang**」と表記されます。
– UNIX、B言語(C言語の元)、UTF-8の開発者ケン・トンプソンや、UNIX、Plan 9、UTF-8の開発者ロブ・パイクによって設計されました。
– 静的型付け、メモリ安全性、ガベージコレクションを備えるコンパイル言語です。
– シンプル、高速、メモリ効率が良い、メモリ破壊が無い、並行処理が得意などの特徴を備えています。
– メモリ破壊が無く、並行処理を得意とする、進化したC言語という側面があります。
– Linux、Mac OS X、Windows、Android、iOS で動作します。

# 言語仕様

### セミコロン

C系統の言語と違い、基本的にセミコロンは必要ない

“`csharp
int hoge = 123;
int fuga = 456;
“`

“`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

元記事を表示

OTHERカテゴリの最新記事