Go関連のことを調べてみた2023年11月05日

Go関連のことを調べてみた2023年11月05日
目次

教育用のGo言語?Go+を触ってみた

# TL; DR

– Goの構文をよりスクリプト言語っぽく手軽に
– Goの標準パッケージが利用可能
– シェルとして使用可能

# はじめに

GitHubのプログラミング言語タグを見ていたところ、`Go+` という言語を見つけました。

https://github.com/goplus/gop/tree/main

READMEによると「エンジニアリング」「理工系の教育」「データサイエンス」向けを謳っているようです。
名前の通りGo言語互換で、さらに `+` となるいくつかの機能が追加されていました(JavaScriptに対するTypeScript的なイメージ)。
本記事では、Go+で面白いと思った構文について紹介したいと思います。

# バージョン

– Go+: `v1.1.8` (執筆時点の最新)

# 実行方法

まずは公式のガイドに従い `gop` をインストールします。Homebrewで入れると楽でした。

https://github.com/goplus/gop/tree/main#how-to-install

コマンドの使い方は `go` コマンドと同様です

元記事を表示

「C++,Go,Rust」の「Win32のGetCursorPos」機能を使って、パソコン画面のマウス・カーソル座標を取得する比較文(WindowsTerminal環境)

# はじめに
– 前回の「WIn32のGetAsyncKeyState」によるキーボード入力編の続きです。
– 今回の座標は「パソコン画面のマウス・カーソル」の座標です。「WindowsTerminal」内の座標ではないので注意です。
– ↓前回

https://qiita.com/good_kobe/items/b3a4efb8de759fd4f7e1

 
# 各言語「C++,Go,Rust」のプログラムの作成条件
– プログラミング中、マウスは適当に動かします。
– 300ミリ秒ごとにループ(繰り返し)する。
– ループを一周する毎に、変数「t」の値を「1」増やす。
– GetCursorPosの座標情報の出力は、変数「pt」に格納する。
– ファイルはutf-8で保存する。(C++は日本語や絵文字が文字化けするのでANSIのみ)

# パソコン環境
– Windows10 : 22H2
– WindowsTerminal(プレビュー版) : 1.19.2831.0
– c++のコンパイラ g++ : 10.3.0
– Go : 1.21.3
– Rust : 1. 72

元記事を表示

Golang ブラウザ操作を自動化する

# はじめに
golangとgolangのpackage [agouti](https://pkg.go.dev/github.com/sclevine/agouti#section-documentation)を用いて Chrome のブラウザ操作を自動化する方法を記載する。

# 実装
1. 任意のプロジェクトに agoutiをインストール

“`
go get github.com/sclevine/agouti
“`

2\.Chrome用ドライバー [chromeDriver](https://sites.google.com/chromium.org/driver/downloads) をインストールしてPATHを設定

chromeDriverはプロジェクト直下に配置、PATHを通した。
PATHを通すのは以下の記事を参考

https://teratail.com/questions/83zeb3i3j6lfni

https://taidanahibi.com/unix/unix-path/#index_id2

3\.コードを実行

“`

func ma

元記事を表示

【Golang】配列の比較による新しい要素の抽出について

Golanfで2つの配列を比較し、一方の配列に存在しない要素を新しい配列に抽出することを実装したため、備忘録として残すもの。
この方法は、データのフィルタリングやデータの整理など、さまざまな応用分野で役立ちます。

### サンプルコード
“`go
package main

import (
“fmt”
)

func main() {
// 配列を定義します
existArray := []int{1, 2, 3, 4, 5}
array := []int{3, 4, 5, 6, 7}

// 新しい要素のみを追加するための空のスライスとして初期化します
var newArray []int

// arrayの要素を順番にチェックし、existArrayに存在しない要素をnewArrayに追加します
for _, element := range array {
found := false
for _, existElement := range existArray {
if existElement == element {
fou

元記事を表示

Goパッケージのセキュリティリスク可視化ツール「Capslock」を触ってみた

ご無沙汰です。@Esperna です。

# 背景
10/31に[Go 1.21 リリースパーティ & GopherCon 2023 報告会](https://gocon.connpass.com/event/299108/)に参加して来ました。
そこで、[Capslock](https://github.com/google/capslock/tree/main/docs
)というセキュリティリスクの可視化ツールが紹介されていて、興味深かったのでブログに書きます。

# Capslock
まず[Capslock](https://github.com/google/capslock/tree/main/docs
)が何かというと、Capslockはmoduleであるpackageとそれが依存するpackageを解析するものです。脆弱性ではなく[Capability](https://github.com/google/capslock/blob/main/docs/capabilities.md)というものを分析し、脆弱性につながる依存関係を検出するものと私は理解しています。

#

元記事を表示

【Golang】スライスの要素を別のスライスに追加する場合のappend()の使い方

Go言語において、スライスに要素を追加するメソッドに「append()」がある。
この「append()」について、あるスライスを展開して、その要素を別のスライスに追加することが簡単にできたため備忘録として残す。

### スライスの要素を別のスライスに追加する方法
“`go
package main

import “fmt”

type User struct {
Name string
Age int
}

func main() {

users := []User{
{Name: “bob”, Age: 10},
{Name: “alice”, Age: 20},
}

otherUsers := []User{
{Name: “jorn”, Age: 15},
}

otherUsers = append(otherUsers, users…)

fmt.Println(otherUsers)
// 結果:[{jorn 15} {bob 10} {alice 20}]
}
“`

**append()の第2引数に追加したいスラ

元記事を表示

【Golang】カラムにGormのDeleted_atが含まれる場合のレコード取得について

論理削除を実装するために、gorm.DeletedAtを使用した場合、レコードの取得のクエリが論理削除されたデータを取得しないように自動的に切り替わる。
場合によって、論理削除したレコードも取得したことがあるため、論理削除したレコードを取得する方法についても備忘録として残す。

### gorm.DeletedAtカラムがある場合のオブジェクト取得のクエリ
以下は公式ドキュメントのサンプルを流用
https://gorm.io/ja_JP/docs/query.html
“`go
type User struct {
ID string `gorm:”primarykey;size:16″`
Name string `gorm:”size:24″`
DeletedAt gorm.DeletedAt `gorm:”index”` // Gormの特定のフィールドタイプの使用
}

var user = User{ID: 15}
db.First(&user) // 論理削除を実装している構造体でFirst()メソッドを実行
//

元記事を表示

[備忘録] IntelliJ(Go)のテスト実行での『No tests were run』問題

# 1. はじめに

しばらくの間、ハマってしまったので、ここにメモとして残します。

最近、Go言語での開発にIntelliJ IDEAを使い始めたのですが、テスト実行で不可解な現象が発生しました。
実行途中でテストが中断され、
**No tests were run** (テストは実施されなかった)
という結果になる現象です。
また、日本語(マルチバイト文字)をログ出力すると、その内容の所々に空白が差し込まれるという問題も起きていました [^1]。

不思議なことにテスト関数名を短くしたり、逆に長くしたりして、良い塩梅の関数名を定義するとテストは動作しました。
しかし、テストのご機嫌をうかがうようなこの対処法では流石に続けられないと、原因を調べることにしました。

![ng-log-mod2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512108/4c6d5529-7583-7330-26aa-6948a2bfe299.png)

# 2. 環境

Windows 10 Home
Intel

元記事を表示

【MongoDB】ソート対象列でnull値があった場合に末尾にしたい

## 概要
例えばPostgreSQLではORDER BY句において、[7.5. 行の並べ替え(ORDER BY)](https://www.postgresql.jp/document/14/html/queries-order.html)のドキュメントにある通り、`NULLS FIRST`や`NULLS LAST`で、ソートにおけるnull値の位置を設定できます。
MongoDBでは2023年11月時点においては、そのような設定は無いようです。では、null値の位置を明示的に設定するにはどうしたらよいか、というのを今回メモ書きします。

## 対応方針
やり方は色々考えられると思いますが、[How to sort null value at the end while in Ascending MongoDB](https://stackoverflow.com/a/69722800)のstackoverflowの回答に書かれている内容が、良いかなと感じました。
対応方針としては、aggregateにおいてソート用のフィールドを設けて、nullの場合は`$ifNull`句で後ろ

元記事を表示

個人開発(バックエンド)

# はじめに
今回、以下の様な技術stackで個人開発を行ったので、備忘録として残そうと思います

– Go(API)
– Next.js・TypeScript(フロント)
– AWS・Terraform(インフラ)
– github actions(CI/CD)

本記事では、バックエンド(API)側の取り組み内容について触れたいと思います
フロント側、インフラ・CI/CD側の記事については以下に置いておきます。

### フロント側
https://qiita.com/__hawk__/items/9ae21e4f51d6f6aa2fd6

### インフラ・CI/CD側
https://qiita.com/__hawk__/items/4ec582d65a8d6edb0a1b

# github repository
### アプリケーション側
https://github.com/hawk0616/recruit-service-board

### インフラ側
https://github.com/hawk0616/recruit-service-board-infla

元記事を表示

GitHub GraphQL APIをGoから実行する。(GitHub App認証)

:::note
本記事では、GitHub GraphQL APIをGoから実行する場合における、認証処理の実装を記載しています。
認証はGitHub Appの仕組みを使用しています。
:::

# はじめに
こんにちは、株式会社Kakukakuのエンジニアのmamoです。
今回、社内でGitHub GraphQL APIをGoからで呼び出す必要があり、GitHub公式ページなどを参考に、実装してみたので実装例のご紹介です。
筆者はGitHub APIの呼び出しやgolang初体験で、至らないところもあるかと思います。

# 前提条件
:::note
go version go1.21.3 darwin/arm64
事前にGitHub Appの作成およびインストール済で、AppIDを取得し、秘密鍵をダウンロード済であること。
:::

# 対象読者
GitHub APIを便利なライブラリなしで認証実装したい人向け。
githubで公開されているような既存ライブラリを使えば認証処理の実装は省けると思うのですが、GitHub公式ページに記載の内容を参考に、実装を試みてみたので、その足跡です。

元記事を表示

Goで学ぶGraphQLサーバーサイド(4)ーリゾルバの実装 – 基本編

こんにちは。

Part 4は「リゾルバの実装 – 基本編」についてです。

# この章について

この章では、前章にて用意した簡略版GitHub APIのリゾルバ部分を実装していきます。

現在リゾルバ用のコードは以下のように自動生成された状態になっていると思います。

“`graph/schema.resolvers.go
// AddProjectV2ItemByID is the resolver for the addProjectV2ItemById field.
func (r *mutationResolver) AddProjectV2ItemByID(ctx context.Context, input model.AddProjectV2ItemByIDInput) (*model.AddProjectV2ItemByIDPayload, error) {
panic(fmt.Errorf(“not implemented: AddProjectV2ItemByID – addProjectV2ItemById”))
}

// Repository is

元記事を表示

【Golang】gormでレコードを1件取得する際の関数及びエラーハンドリングについて

gormの公式に記載があるが、レコードを1件取得する関数及びエラーハンドリングについて備忘録として残す。

## 用意されている関数
* First()
* Last()
* Take()

### First()関数について
“`go
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
“`
条件に合致するレコードを「id」で昇順ソートし、ソートされた最初の1件を取得する。

### Last()関数について
“`go
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
“`
条件に合致するレコードを「id」で降順ソートし、ソートされた最初の1件を取得する

### Take()関数について
“`go
db.Take(&user)
// SELECT * FROM users LIMIT 1;
“`
順序指定なしで1件のレコードを取得する

## レコードが見つからなかった場合
First()、Take()、Last()関数で

元記事を表示

【Golang】参照型の初期値について

Golangでは、
スライス(slice)、マップ(map)、チャネル(channel)などの参照型の変数は、デフォルトでnilとして初期化されます。
これは、 **参照型が内部的にはポインタを持っており、nilはポインタが無効であることを示す** ためです。そのため、関数がスライスを返す場合、そのスライスがnilであることは有効な状態であり、コンパイラはエラーを生成しません。

## スライスの初期化
以下は、スライスを初期化し、それを返す関数の例です:
“`go
package main

import “fmt”

func main() {
// 初期化
var slice []int

if slice == nil {
fmt.Println(“スライスはnilです”)
} else {
fmt.Println(“スライスはnilではありません”)
}
// 結果: スライスはnilです

fmt.Println(slice)
// 結果:
}

“`

## マップの初期化
以下は、マップを初期化し、

元記事を表示

【初学者】malformed module path “command-line-arguments”: missing dot in first path elementの解決手順

# はじめに
お疲れさまです!
おおくまです!

https://www.udemy.com/share/103TVa3@4kwnCMQ2PbkgS2i2YK2IF6VPItXbl8tA-PI4XVWjk6Snxsv71ohaHmMYakH42khRcA==/

こちらのコースのセクション13で、“malformed module path “command-line-arguments”: missing dot in first path element“というエラーが出ました!
その解決手順の備忘録です!

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# エラー内容

“`:ディレクトリ構成
.
└ workspace
└ golang_kisonyumon
└ section13
├ foo
│ └ foo.go
└ main.go
“`

“`go:main.go
package main

imp

元記事を表示

hcl v2 パッケージを使って HCL の var.* をリテラルに置き換えてみた

# はじめに
terraform でリソース管理している中で、「特定の HCL ファイル内の一部の variable だけ具体的なリテラルで置き換えたい…」と思うことがありました。
そこで HCL ファイル中の変数をリテラルで置き換えるツールを作ってみました。

https://github.com/heptaliane/tffreeze

ツールを作成するに当たっては、 hashicorp 公式のライブラリである、 `github.com/hashicorp/hcl/v2` を使ったのですが、

* HCL の構成要素の具体的な例や関係性がぱっとわからなかった
* HCL の変数の書き換えに関する記事が見つけられなかった

というつらみがあったため、備忘録も兼ねて記事にすることにしました。

本記事では、HCL の構成要素について、自分なりの解釈を具体例を交えた解説を行い、それを踏まえて HCL の変数をリテラルに書き換えた方法について説明します。

# 使用したライブラリ
ツールの作成に当たり、使用したライブラリは以下のとおりです。
* `github.com/hashicorp/

元記事を表示

[GCP] Operations 機能x実装

# GCPのOperationsの概要と機能

GCP(Google Cloud Platform)のOperationsは、クラウドサービスの監視、管理、トラブルシューティングに用いられるツールです。Operationsを使用することで、アプリケーションやインフラストラクチャの健全性とパフォーマンスを維持し、サービスの可用性を向上させることができます。

Operationsには以下のような機能があります。

## 1. ログの監視と分析
Operationsは、サービスやアプリケーションのログをリアルタイムに監視し、集約して表示します。さまざまなログソース(例:VMインスタンス、データベース、ネットワーキング)からのログを収集し、分析することで、重要な情報やエラーを素早く発見することができます。

## 2. ダッシュボードの作成
Operationsでは、カスタムダッシュボードを作成することができます。ダッシュボードには、重要なメトリクスやログデータを配置し、サービスのパフォーマンスをリアルタイムで可視化することができます。これにより、アプリケーションの動作状況を把握し、適切な対

元記事を表示

GoでKeyとValueを逆にしたMapを作成する

goでMapを定義したときに
そのkeyとvalueを逆にする方法を紹介します。

例えば、以下のようにprotoで定義された型からアプリケーション上で定義したmodelに
マッピングするために、Mapを用いることがあるかと思うのですが、
proto->modelのMapからmodel->protoのMapを生成する方法を紹介します。

具体的には次のようなケースを想定しています。
“` go
// 以下のようなMapから
var protpToModelMap = map[v1.PaymentMethod]paymentmethod.PaymentMethod{
v1.Credit: paymentmethod.Credit,
v1.PayPay: paymentmethod.PayPay,
v1.AuPay: paymentmethod.AuPay,
v1.RakutenPay: paymentmethod.RakutenPay,

}

// 次のようなMapを作成したい時
var modelToProtoMap = map[p

元記事を表示

【Golang】実体とポインターで見る構造体の初期化の違い

Golangにおいて、実体かポインターとして構造体を初期化する際の挙動の違いを把握したため、備忘録として残すもの。

## 実体で構造体を初期化する場合
“`go
package main

import “fmt”

type User struct {
name string
sex int
}

func main() {
var instanceUser User // User構造体を実体として定義

fmt.Println(instanceUser) // 結果:{ 0}
fmt.Println(instanceUser.name) // 結果:
fmt.Println(instanceUser.sex) // 結果: 0
}
“`

:::note info
実体で構造体を初期化すると、 **初期値** が格納される
:::

https://go.dev/play/p/b5WWHjo16l5

## ポインターで構造体を初期化する場合
“`go
package main

import “fmt”

type User struct {

元記事を表示

[Docker]マルチステージビルドをサクッと試してみる

## はじめに
本記事では、Dockerの「マルチステージビルド」について、サクッと試して、そのメリットを確認してみようと思います。

なお、筆者は、Dockerは初心者です。一般的な技術書に書いてあることをざっくり理解しているレベルです。

## きっかけ
表紙のサブタイトルに惹かれて以下を読みました。

> 理想のコンテナイメージを作る Dockerfileのベストプラクティス

:::note info
[ソフトウェアデザイン 2023年11月号](https://amzn.asia/d/iUDMacE “ソフトウェアデザイン 2023年11月号”)
Amazonのリンクです。興味があればぜひ。
:::

その中で、色々と試したいことがあったのですが、まずは「マルチステージビルド」をやってみます。

## 前提
– golangを用いて、簡単なAPIをコンテナ化します。
– Dockerの基本的なお話は省略します。
– ベースイメージはalpine linuxを使用します。

## まずはやってみる
### dockerfile
– 筆者がこれまで書きがちだったdockerf

元記事を表示

OTHERカテゴリの最新記事