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

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

GoLangを使うのはなぜ?

Go言語(Golang)は、Googleによって開発されたオープンソースのプログラミング言語です。近年、その人気が高まっており、様々な用途で使用されています。

Go言語を使う理由は、以下のようなものが挙げられます。

**1. シンプルでわかりやすい**

Go言語は、C言語のような構文を持ちながら、よりシンプルでわかりやすい言語です。そのため、初心者でも比較的簡単に学ぶことができます。

**2. 高速な処理速度**

Go言語は、C言語のようにコンパイルされる言語です。そのため、実行速度が非常に速いです。

**3. 並行処理に優れている**

Go言語は、goroutineと呼ばれる軽量スレッドを用いて、簡単に並行処理を行うことができます。

**4. 標準ライブラリが充実している**

Go言語は、標準ライブラリが充実しています。そのため、様々なタスクを簡単に実行することができます。

**5. 静的型付け**

Go言語は、静的型付け言語です。そのため、実行時エラーを防ぐことができます。

**6. テストがしやすい**

Go言語は、テストがしやすい言語です。そのため、コ

元記事を表示

Vscodeでgoテストのタイムアウトを伸ばす

1. vscodeでSettingsを開く
![スクリーンショット 2024-04-19 12.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961840/82794284-ef96-fad5-d369-c70605deea0f.png)

1. `go.testTimeout`を検索
1. タイムアウトを設定する

– 参考

https://stackoverflow.com/questions/73033725/how-to-edit-default-go-test-timeout-in-visual-studio-code

元記事を表示

[Go]JSON文字列とデータオブジェクト間の変換

# 概要
Golangにおける標準パッケージ `json` を使った以下の操作について記述。
JSON文字列を構造体に変換( `json.Unmarshal` )
構造体をJSON文字列に変換( `json.Marshal` )

※Railsでいうところの `.to_json` , `JSON.parse` のお話。

以下、基本的な処理のサンプルコード。
https://go.dev/play/p/W5Of2mG79Mf

“`sample.go
package main

import (
“encoding/json”
“fmt”
“log”
)

// パースしたJSONを受け入れる構造体
type jsonBlock struct {
StringKey string `json:”string_key”`
IntKey int `json:”int_key”`
FloatKey float64 `json:”float_key”`
}

func main() {
// パース対象のJSONバイナリ
jsonBlockBin := []

元記事を表示

[Go言語]goqueryを用いたWebスクレイピングメモ

## 概要

* ライブラリ`goquery`を用いたWebスクレイピング方法についてメモする。

## goquery 概要

* Go言語で開発されたライブラリ。
* 主にHTMLドキュメントの解析と操作を行うために使用される。
* jQueryのようなシンタックスを模倣しており、HTMLドキュメントを簡単に選択、操作、抽出することができるように設計されている。

**主な特徴**

1. **jQuery風の操作**: jQueryの選択子やメソッドを模倣しているため、WebページのDOM要素を簡単にトラバース(走査)や操作が可能。これにより、HTMLドキュメントからのデータ抽出が容易になる。
2. **HTMLドキュメントのパース**: HTMLをパースしてドキュメントオブジェクトモデル(DOM)を作成し、その後、要素を簡単に検索して操作できる。これはWebスクレイピングやテストデータの生成など、さまざまな用途で利用できる。
3. **軽量で高速**: Go言語の軽量性と高速な実行速度を活かし、効率的なHTMLドキュメントの処理を実現する。

**使用時の留意事項**

1.

元記事を表示

JWTのBase64URLデコードで引っかかった話

JWTの各要素をパースする処理を自前で書いていたときに、ちょっと詰まってしまったので備忘録として記述しておく。

# 結論
– Base64エンコードとBase64URLエンコードは異なるものである。
– JWTのヘッダ、ペイロード、署名はそれぞれBase64URLエンコードされているものなので、取り出すにはBase64URLデコードしないとダメ。
– Goならば `base64.RawStdEncoding.DecodeString`関数を使う。

# Base64エンコードとBase64URLエンコード
要約すると以下の違いあり。

**Base64エンコード**
`A-Z, a-z, 0-9, +, /`しか扱うことができない通信環境において、元のデータをこれらの文字にエンコードする方式。
パディング文字として`=`が使われる。
主にEメール、Basic認証、インターネット掲示板で使われる。

**Base64URLエンコード**
URLでは`+, -`は特別な意味をもつため、Base64エンコード済み文字列の中でこれらに相当する文字はそれぞれ`-,_`に変換して扱う方式

元記事を表示

Antlr4の構文解析をgo言語に組み込もう

# antlr4
https://www.antlr.org/
antlr4((ANother Tool for Language Recognitionのversion4の頭文字です)は与えられたテキストに対してルールを設定し、それに応じた処理への振り分けを行うパッケージです。大分ざっくり言うと自作のプログラミング言語(DSL:Domain-Specific Language)を作ることができます。
ただ、antlr4が構文を解析した後の各パーツに対応する処理は自分で書かなければいけません。go言語でこの部分を作る機会があったのでその例を紹介したいと思います。
今回は四則演算のstringを処理して計算結果を返すようなparser(生成された構文解析器)を作ろうと思います。

# 環境構築
vscodeの拡張機能を入れれば、すぐに使えます。以下の記事を参考にしました。
https://qiita.com/i-tanaka730/items/4eeaae247f70895c3456

# grammarファイル
antlr4に読み込ませるinputファイルです。
ここに、構成要素や演算

元記事を表示

Go言語 Docker開発環境構築方法 メモ

## 概要

* DockerでGo言語の開発環境を構築する方法について備忘録としてメモする。

## 環境情報

* OS:WSL2 Ubuntu-22.04
* Docker:24.0.7
* docker compose : v2.10.0
* Visual Studio Code:1.85.1

## 手順

### 1. 作業用フォルダにDockerfile、docker-compose.ymlを作成する

* 任意の作業用フォルダの直下に次の2ファイルを作成する

* `Dockerfile`

“`dockerfile
# ベースイメージ
FROM golang:1.22rc1-alpine3.19
# コンテナ内のディレクトリ作成
RUN mkdir /go/src/app/
# 作業用ディレクトリ設定
WORKDIR /go/src/app/
# ホスト上のファイルをコンテナ作業用ディレクトリにコピー
COPY ./ /go/src/app/
“`

※ベースイメージは[公

元記事を表示

最近登場したプログラミング言語の多様性:未来への道

![Internship-Robby-Coding-1024×522.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3771407/9f05d86d-9343-baab-3069-69c6dd97f2ad.jpeg)

近年、テクノロジーの進歩に伴い、新しいプログラミング言語の登場が加速しています。これらの言語は、異なる用途やニーズに応えるために設計され、開発者コミュニティに革新的なアプローチをもたらしています。以下では、最近注目されているいくつかの新しいプログラミング言語を紹介します。

Rust(ラスト):

Rustは、システムプログラミングのためのモダンで安全な言語として急速に人気を集めています。メモリの安全性と並行性を重視し、パフォーマンスと安全性を両立させることが特徴です。システムレベルのプログラミングや組み込みシステムの開発に適しています。

Kotlin(コトリン):

Kotlinは、Java Virtual Machine(JVM)上で動作する静的型付けのプログラミング言語です。An

元記事を表示

Compute Engine に MySQLをインストール【CentOS 7】

# はしがき

ネットにある記事を参考にしながら作業を行うと躓くことが多くありました。この記事では、Compute Engine上でMySQLが動き、ローカルからログインできるところまでの手順を記載します。

無料枠のCompute EngineでMySQLを使いたい人には参考になるかもしれません。

最後には、Go言語を使ったGCEのインスタンスの起動と停止、IPアドレス取得プログラムが書いてあります。

## 環境

* 2024年4月17日
* Mac OS 14.0 (Intel Mac)
* Google Chrome

# 手順

## Compute Engineのインスタンスを作成

有効になっていない場合は、Compute Engine APIを有効化

* リージョン:us-west1
* ゾーン:us-west1-b

* マシンタイプ:e2-micro
* ブートディスク:
* OS:CentOS
* バージョン:CentOS 7
* ブートディスクの種類:標準永続ディスク
* サイズ:30GB

* 「詳細オプション」→「ネット

元記事を表示

TypeScript+React+Goで適当にアプリを作ってみる

# この記事について
色々あってReact+Goについて知る必要が出てきたので、勉強がてら適当にアプリ作ってみました。React+TypeScript+Goのアプリって結構世間にありそうだし、ネットに情報たくさんあるから勉強しやすいかなとか思ってたらとんでもない。これをトレースすればOKみたいな記事がなくって結構苦労したので、何なら自分が記事書くか、という感じ。

# 記事の作者について
最近はPMしかやっていないザコRubyist。ReactとGoの経験はなく、TypeScriptは実務でほんのりやったくらい。ちなみに次の職場ではエンジニアやらない。

# ソースはここ
https://github.com/gitk47320/go_react
* ReactとかGoとかど素人で、ネットの情報かき集めてとりあえず動くところまで何とかしたというレベルなので、使用時はその辺気をつけてほしい
* 言い訳がましいですが、命名とか細かいところでイケてないなあって思うところはありますので、そこはご愛敬。気が向いたら直す予定

# アプリの構成について
* ローカル環境はdockerで構築
* フ

元記事を表示

[Go]スライスの破壊的なソート, 非破壊的なソート

# 概要
golangでは標準で破壊的なソートをする関数が用意されているが、非破壊的なソートをする手段は用意されていないため、自前で実装する必要がある。この記事では、それぞれの実装コードを例示する。

# 破壊的ソート(`sort.Slice()`)
golangでスライスをソートする際には、標準パッケージの関数`sort.Slice(x any, less func(i, j int) bool)`を使う。

“`sample.go
package main

import (
“fmt”
“sort”
)

// sampleStruct スライスの要素の型となる構造体
type sampleStruct struct {
a int
}

// String サンプルコード内でのPrintf()でのキレイな出力用に定義してるだけ
func (s *sampleStruct) String() string {
return fmt.Sprintf(“{a: %d}”, s.a)
}

func main() {
sampleStructs := []*sampleSt

元記事を表示

Goの構文解析に入門してみる

Goのソースコードを処理するツール(コードチェックやデータ生成など)を作ってみたいと思ったので、Goの構文解析に入門してみました。

## まえがき

ソースコードを何らかのツールにかけて処理したいことはよくあるかと思います。
例えばコードのルールチェックやフォーマットを行うとか、特定のフォーマットで書かれたコード(やコメント)から何らかのデータ(APIドキュメントなど)を自動生成するなどです。

昨今ではこのような処理を行うためのツールが多数提供されており、多くのプロジェクトで利用されています。
しかし、プロジェクトに固有なルールであるとか、独自のデータファイルを生成したいとなったとき、それら既存のツールでは対応できないこともあります。
そのような場合は「自分たちでツールを作る」ということが考えられますが、その際にはどのようにしてソースコードを処理すればよいのでしょうか?

簡単なツールであればちょっとしたスクリプトと正規表現などの文字列処理で実現することも可能かと思いますが、そういった単純な実装では文法を考慮した厳密な処理が難しかったり、謎の正規表現だらけでツール自身の保守性が悪く

元記事を表示

LambdaでGoのHelloWorldをやってみた

GoはシングルバイナリでLambdaと相性が良いらしい・・・といったレベルの初心者なので、まずは公式のドキュメントのとおりにやってみる。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/golang-handler.html

“`go mod init main“`して、“`go.mod“`を作成し、“`main.go“`に例示されたコードを張り付ける

“`go
package main

import (
“context”
“fmt”
“github.com/aws/aws-lambda-go/lambda”
)

type MyEvent struct {
Name string `json:”name”`
}

func HandleRequest(ctx context.Context, event *MyEvent) (*string, error) {
if event == nil {
return nil, fmt.Errorf(“received nil event”)
}

元記事を表示

【個人開発】キリ番を祝ってくれるGithub Actionsをリリースしました🎉【Go】

# 宣伝

GithubのIssue, Pull Requestには連番で番号が振られています。
この番号においてキリ番(キリの良い番号の略)を踏んだときに、誰も祝ってくれないのは寂しくないですか?
[kumackey/kiriban](https://github.com/kumackey/kiriban)を使えば、キリ番を踏んだときにコメントで祝ってくれます!🎉

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496036/43ffb89d-136a-f8dc-be04-1f279c9cd070.png)

![comment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496036/f3ab73df-60e2-e482-e452-cf010d08dc37.png)

今までキリ番を踏んだ人のリストや、次のキリ番も予告してくれます。

# 使い方

[README](https://github.co

元記事を表示

[GO言語] GORM と Gen を導入した話

# はじめに

Go 言語を使った DB 処理に ORM として GORM/Gen を入れてみたので、その作業時に備忘録として記事にしました。
これから GORM/Gen を使った開発環境を構築する方の一助になれば幸いです。

なお [GORM](https://gorm.io) は Go 言語 における ORM。 [Gen](https://github.com/go-gorm/gen) は GORM をサポートしたコードジェネレーターです。

# 環境と各ツール

| | バージョン | 備考 |
| ————————————————————– | ——— | —————————————————- |
|

元記事を表示

Go言語で作るDiscord Bot

# Go言語で作ったDiscord Botのお話

## 開発経緯
当時、スマホMMOをやっていた時ですが
血盟(チームのようなもの)でいろいろアンケート?参加集計?等を取る際に
Discordを使っていました。

それに特化したBotが欲しいなと思い作成しました。

## システム構成
今回も、いつも放置で使っている自分のPCでBotを動かしました。
というのも、永続的に動作されるサーバーの用意が結構面倒な状況に現在なっている為
致し方なくな構成ではあります。

ローカルの場合には、外部定義ファイルにデータ保管するのもお手軽であり
Googleスプレットシート等で十分にお手軽なDBのような事ができました。

今回は、外部定義の絡みが多いため
プログラム一式の公開はちょっと面倒なので避けます。

## 開発した機能
・メッセージのリアクション集計
・リアクションを集計する為のリストをBOTに作成させる
※実際には18機能ぐらいありますが、どれも組み合わせみたいなものなので・・・・

# プログラムのお話
なかなかきれいに作るのが難しく、過去に作成したプログラムから情報を抽出しています。

元記事を表示

Go言語でブロックチェーンのシステムを作成する(その4)

## はじめに
前回は、transactionsの実装までやりましたが、今回はnonceの実装をしていきます。

– 前回までの記事

https://qiita.com/jun_11/items/a1adf93ba02292321b25

https://qiita.com/jun_11/items/259f0a777e12b3fa1b32

https://qiita.com/jun_11/items/61adfc340792cdb2af08

– バージョン
– Go 1.22.0

## nonceとは
nonceは、新しいブロックを作成する時に、そのブロックが正しいものだと証明するために使われます。
下の図のように新しいブロックを作成する時に、challenge、prev hashとtransactionsを使用してハッシュを生成します。このときchallengeはnonceに入れる候補となる値です。
例えば下の図では、生成したハッシュの先頭が000となるまでchallengeを増やしていって、challengeが10の時ハッシュの先頭が000になったので、challen

元記事を表示

Go言語で作成した利用者専用のDiscord Bot スクショ送信Bot

## 作ったもの
私、スマホゲーマーなんです。
そして、PCゲーマーでもあります。
という事は、PCに入れたNox等で複数キャラ同時育成なんかやっちゃいます。

私のPCこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764841/41128204-ad23-3f0c-343a-442a59ff9abc.png)

外出時等、アプリが落ちてしまったりしていないか
キャラが死んでいないかいつもドキドキしています。

そのチェックをするために今回開発を行ったのが
DiscordのBotを利用して、Discordで話しかけるたびに
デスクトップのスクショを送ってくれるソフトを開発しました!!!

![discord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764841/5c32de5b-39f8-1ae8-46bb-ce4dd77abd13.png)

このBotに話かけるだけで

元記事を表示

go-ruleguardのルール定義でコンパイルエラーが起きたのはなぜ?―独自Goコンパイラを探る

# TL; DR

– `go-ruleguard` のルールファイル `rules.go` は独自Goコンパイラでコンパイルされる
– そのため、専用のオブジェクト、メソッド呼び出し以外は使えない

:::note info
本記事ではruleguardの実践的な活用方法については触れていないので、予めご了承ください :bow:

(エラーが発生したときの原因調査には少しだけ役立つかもしれません)
:::

# go-ruleguardとは?
(ご存じの方は次の章まで読み飛ばしてください)

go-ruleguardはGoのlinter(およびそのCLI)です。

https://github.com/quasilyte/go-ruleguard

特徴として、**ユーザーが1からルールを作成できる**ことが挙げられます。ASTに対するパターンマッチで記述できるため、**構文レベルでルールを設定可能**です。

(以下 `v0.4.2` 時点の内容です)

“`go:rules.go
// READMEより抜粋
//go:build ruleguard
// +build rule

元記事を表示

Go言語における構造体(struct)の基本

### 構造体とは?

go構造体は、異なるデータ型の変数を一つにまとめるための複合データ型です。例えば、名前、年齢、住所を一つの「人」型としてグループ化することができます。これにより、データの管理と操作が容易になります。

### 構造体の宣言

構造体は`struct`キーワードを使用して宣言されます。以下に簡単な構造体の宣言例を示します。

> type キーワードで構造体をひとつ作るということは、struct で定義された新しい型 (type) を定義する、ということになります。

“`go
type {struct_name} struct {
filed1 type
filed2 type

}
“`

“`go
type Person struct {
Name string
Age int
Address string
}
“`

この例では、「Person」という名前の構造体を定義しています。この構造体には、Name、Age、Addressという3つのフィールドが含まれています。

### 構造体の利用

元記事を表示

OTHERカテゴリの最新記事