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

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

【Golang】Go 公式の脆弱性チェッカー govulncheck 【Goのための脆弱性管理】

Go 言語の Go モジュールによる、パッケージの脆弱性をローカルでチェックできる公式ツール `govulncheck` が [2022/09/06 に発表された](https://go.dev/blog/vuln)ので、その使い方(TL; DR)とリリース情報の翻訳(TS; DR)です。

## TL; DR (今北産業)

1. インストール:
“`shell-session:ツールのインストール(要Go1.18以降)
$ go install golang.org/x/vuln/cmd/govulncheck@latest
“`
1. 脆弱性のテスト実行:
“`shell-session:ツールの実行
$ govulncheck ./…
“`
1. 使い方:
“`shell-session
$ govulncheck -h
usage:
govulncheck [flags] package…

元記事を表示

【Golang】文字列スライスのソート速度比較【2023 年上半期版】

> Go 言語(以下 Golang)の `slice`(可変配列)のソートで速度比較をしたい。

Golang で文字列のスライス(`[]string`)をソートするには、`sort` パッケージの `sort.Slice` や `sort.Strings` 関数を使うのが簡単です。

ところが、Golang の `slices` パッケージのソート(golang.org/x/exp/slices.Sort)が速いらしいと聞いて速度比較(ベンチマーク)してみました。

どうやら、[クイックソート](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88)と[ヒープソート](https://ja.wikipedia.org/wiki/%E3%83%92%E3%83%BC%E3%8

元記事を表示

labstack/echoとmiddleware.Loggerとエラーレスポンス

github.com/labstack/echoのロギングについての備忘録です.
echoのログを活用していきたい…と考えてます。

# 前提

* go 1.19
* echo v4.10.0
* echoのErrorHandlerはDefaultHTTPErrorHandlerを使用
* https://github.com/labstack/echo/blob/v4.10.0/echo.go#L389-L429

# はじめに、正常応答させてみる

echoの`middleware.Logger`をカスタマイズせずに使用します。

“`go
// ~省略

e := echo.New()
e.Use(middleware.Logger())

// ~省略

e.GET(“/”, func(ctx echo.Context) error {
return ctx.String(http.StatusOK, “Hello world!”)
})
“`

curlで呼び出します
“`sh
#localhost, port=8888で実行しているとき
curl

元記事を表示

PHPerが学ぶGo言語③ 例外処理

っす。豚野郎です。
今回は例外処理を書いていきます。

Go言語は例外処理構文(try、catch等)がありません。
その中で例外処理を実行していきます。

※ 注意:内容はPHPか何かの言語を書いたことがある方向けなので、
説明を割愛している箇所は多々ありますので、ご了承ください。

**go version go1.19.4 darwin/amd64**

# 1. fmt.Errorf()
“`sample.go
package main

import “strconv”
import “fmt”

// fmt.Errorf()で例外情報作成
// fmt.Errorf()の戻り値の引数はerrorにする。
func Calculation(num int) (string, error) {
if num != 1 {
// Go言語では、エラー情報を2番目に返すことを推奨されている
return “”, fmt.Errorf(“1ではありません。”)
}
num += 1
return “1 + 1 =

元記事を表示

QiitaのAPIを使って、IT資格の参考書を自動ランキングするサイト作ってみた

こんにちは、暇があれば個人開発している厚木です。
今回は、エンジニアにウケそうな新規サービスを出したので、その宣伝記事です。

## 作成物
[毎日QiitaのAPIから、IT資格試験の書籍を紹介している記事を集計して、自動的にランキングサイト](https://qiibooks.com/)を作成しました。
書籍の情報登録以外は、全て自動で行われています。

https://qiibooks.com/
![](https://storage.googleapis.com/zenn-user-upload/d441d2527cc4-20230121.png)

## なぜ作ったのか
最近「[mybest](https://my-best.com/)」という比較サイトをよく見ていて
「これIT分野でもできるんじゃね?」と思ったのがきっかけです。
で、エンジニアが本を買うとしたら資格本かなー、、、くらいしか考えずに作りました。

作ろう決心した30分後、Qiitaを使ってテック系の本をランキングする「[テックブックランク](https://techbookrank.com/)」という同じ系統

元記事を表示

【Go】古い記法で書いたbuild constraintsは後方互換するのか調べてみた

# はじめに
build constraintsのための記法は、ver1.17以上で新しい書き方になっていたことを最近知りました。

https://go.dev/doc/go1.17#gofmt

古い記法
“`go
// +build ignore
“`

現在の記法
“`go
//go:build ignore
“`

そこでふと「Goは後方互換が保たれた言語だけど、ビルドタグも同様に後方互換されるんだろうか?」という疑問が浮かびました。
今回は、build constraintsの後方互換(?)について調べてみた内容を書いてみます。

# 調べた結果
`go fmt`コマンドを使えば、ver1.16以下で使用されていた古い表現を検知して、自動的に現行の表現を追加してくれるみたいです。

>Go versions 1.16 and earlier used a different syntax for build constraints, with a “// +build” prefix. The gofmt command will add an equivalent

元記事を表示

【Hugo】wowchemyテーマで静的サイトを生成する際 fatal: ‘origin’ does not appear to be a git repository… が発生した時の対応

静的サイトジェネレータ Hugo でハマった問題に対応した内容の忘備録です。

## 環境
– MacOS Ventura
– Hugo (Theme: wowchemy)

## 問題
初めてHugoを導入しようと頑張って作成したサイトをいざ生成しようと、`hugo` コマンドを実行すると、下記のエラーが発生。リポジトリが読めないとのことなので、URLが変わったのかと思いましたがそんなことはなく。。
ちなみに昨日までは問題なく動作していました。まさに「なにもしてないのに壊れました」っていうアレです。

“`
go: github.com/wowchemy/wowchemy-hugo-themes/modules/wowchemy/v5@v5.7.1-0.20221127215619-58b270a3e103: invalid version: git ls-remote -q origin in /var/folders/pd/jt86y4cj2kbdw_k5rwjjt_dr0000gn/T/hugo_cache/modules/filecache/modules/pkg/mod

元記事を表示

interfaceやprotocolってなんぞ?

## はじめに
私は、現在大学生なのですが、同じ学部の大学生からソフトウェアエンジニアのバイトをできる人が集まりませんでした。そこで今回は使用している`interface`をわかりやすく解説していこうと思います。

Goにおける`interface`は他言語にも実装されており、JavaやObjective-Cも同様の語句で使用・実装できます。ただ、私の専門がswiftなので`interface`と同じ役割の`protocol`を使います。 :pray:
説明上は`interface`を使いますが、コード上では`protocol`と書きます。

## そもそも`interface`とは?

`interface`の説明の前に、、、オブジェクト指向って知ってる?:thinking:

### オブジェクト指向(言語)をざっくり解説
「この世の全てのものは`object(モノ)`であり、`モノ`はそれ固有の処理を有する。その`モノ`が集まってこの世の`モノ`はできている。」みたいな考え方。`モノ`を表現する方法で`class`や`struct`を使用します。
例)荷車:タイヤ(回転して

元記事を表示

同時実行するゴルーチンの数を抑える

ゴルーチンを使って並行処理を書きたいが同時実行数を制御したいという場面は多々ある。メモリ・CPUなどリソースは限られてますから。

## バッファ付きを使ったゴルーチン数の制御
バッファ付きチャネルの次の特性を使って、計数セマフォとして使うことで簡単に実現できる。

– 空きがあれば送信側は待たされない
– 空きがなければ送信側は待たされる(ブロックされる)

“`go
package main

import (
“fmt”
“sync”
“time”
)

const concurrencyNum = 3 // 同時実行数

func main() {
tasks := []string{“タスクA”, “タスクB”, “タスクC”, “タスクD”, “タスクE”}

sem := make(chan struct{}, concurrencyNum)
var wg sync.WaitGroup
for _, t := range tasks {
sem <- struct{}{} // wg.Add(1) go func(t string) {

元記事を表示

【echo】カスタムloggerの実装

# はじめに
ハンドラーの処理をロギングする際に、echo middlewareに用意されているloggerではなくサードパーティのロギングライブラリを利用したかったため、カスタムしたloggerをechoに設定する必要がありました。

以下を前提条件とします。
– Go version:1.19
– echo version:4.0.0
– ロギングライブラリ:logrus

# 実装
logrusをカスタムloggerとして設定する場合は、以下のコードになります。
ポイントは、logrus.Fields構造体のフィールドを増やすだけではなく、RequestLoggerConfigのフィールドにあるLogXxxの値をtrueにしておくことです。
以下のようにフィールドを列挙してログに残したい項目を追加していきましょう。

“`go
log := logrus.New()
e.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{
LogMethod: true,
LogURI:

元記事を表示

Lima の containerd へ接続してみる

最近、macOS を使い始めて、課題となったのが Linux のコンテナ環境をどうするかという事でした。

あまり余計な事をせずに [containerd](https://github.com/containerd/containerd) が動作するようなものを探したところ Lima を見つけました。

* [Lima](https://github.com/lima-vm/lima)

Lima は Linux 仮想マシンで containerd がビルトインされています。
containerd を操作するための CLI ツール [nerdctl](https://github.com/containerd/nerdctl) (Docker との互換性あり)も導入してくれるので、これだけでコンテナの実行環境が整います。

そこで今回は、Lima の環境を構築するついでに、仮想マシン内の containerd へ Go 言語のコードで接続してみました。

# はじめに

Lima をインストールし、仮想マシンを実行しておきます。

##### インストール例
“`
% brew i

元記事を表示

spreadsheetのURLだけから内容を取得してみた。

今回はシート名が不明な状態でURLだけからシートを取得する方法を書きます。
まずよくあるシートを取得するサンプルコードを紹介します。
読むとわかりますが、spreadsheetのIDとシート名を使って取得しています。

“`go
package main

import (
“context”
“fmt”
“log”

“google.golang.org/api/option”
“google.golang.org/api/sheets/v4”
)

func main() {
spreadsheetID := “1zrqghzR3UJdrS70JLKLgujCnmGFN93vIf1B7XmtblOM”
credential := option.WithCredentialsFile(“test.json”)

srv, err := sheets.NewService(context.TODO(), credential)
if err != nil {
log.Fatal(err)
}
// シート名と参照範囲をくっつけた文字列を使う(シート名だけ

元記事を表示

Goを使ってDynamoDBに一括書き込み

aws-sdk-goを使ってDynamoDBを操作するメモです。
こちらの[リンク](https://docs.aws.amazon.com/ja_jp/code-library/latest/ug/go_2_dynamodb_code_examples.html)を見ながら基本的なCRUDは一通りできたのですが、一括処理はうまくできませんでした。
一括書き込みの箇所についてデモを作成しようと思います。

### 環境
`go version 1.17.2`

`aws-sdk-go v1.44.180`

### 前提
DynamoDBにユーザ情報を一括登録する想定です。
ユーザ情報はHTTPリクエストボディから受け取ります。
Lambda上で受け取ったデータを構造体に変換し、DynamoDBに書き込みます。

### 構造体を定義
ユーザ情報を表現する構造体を定義します。

“`go:main.go
type User struct {
ID string `json:”id”`
Name string `json:”name”`
}
“`

### リクエストボディか

元記事を表示

Go言語のクリーンアーキテクチャ例

**やりたいこと**
ハンドラー⇒ユースケース⇒リポジトリのようなプロセスをクリーンアーキテクチャな作りにしてテストをしやすくする。

**サンプル**
あくまで例となりますので1ファイルに纏めております。

“`golang
// main.go
package main

import “fmt”

// handlerパッケージに置くイメージ
type Handler struct {
uc UsecaseIF
}

type HandlerIF interface {
HandlerProcess()
}

func NewHandler(
uc UsecaseIF,
) HandlerIF {
return &Handler{uc: uc}
}

func (h *Handler) HandlerProcess() {
fmt.Println(“Handler Process”)
h.uc.UsecaseProcess()
}

// Usecaseパッケージに置くイメージ
type Usecase struct {
db DBIF
}

type Useca

元記事を表示

Go言語のオーバーライド例

**やりたいこと**
親structを取り込み子struct側のメソッドでオーバーライドさせる。

**親のみ**

“`golang
// maing.go
package main

import (
“fmt”
)

type Parent struct {
NameParent string
}

func main() {
c := Parent{“親”}
c.Method()
}

func (p *Parent) Method() {
fmt.Println(p.NameParent)
}
“`

**結果**

**親を取り込みオーバーライド**
Parentをembeddedフィールドとして取り込み、Methodレシーバで値を操作する。

“`golang
// main.go
package main

import (
“fmt”
)

type Parent struct {
NameParent string
}

type Child struct {
Parent // embedded
NameChild string
}

元記事を表示

【Golang】ビットの非含意(P ⊅ Q)【ビット演算で特定ビットを 0 にする。反転ではない】

> Go 言語(以下 Golang)で、バイトデータの「特定箇所のビット」を確実に `0` にしたい。
> 0b100001000b10000000
> 0b100000000b10000000
>

つまり、スイッチを下げるがごとく、**ビットマスクが `1` なら、どのような状態であっても `0` にしたい**のです。いわゆるひとつの、**論理演算における「非含意ひがんい」(`P ⊅ Q`)をしたい**のです(ゆうて、そんな名前が付いてるって知らんかったけど)。

## TL; DR (今北産業)

1. やりたいことは以下。
![スクリーンショット 2023-01-18 9.58.14.pn

元記事を表示

Go言語のテストファースト例

**やりたいこと**
外部APIやDBへのアクセス処理が含まれるメソッドをモックしてテストする。

以下★のメソッドをテストします。

**実装側**
外部アクセス処理のあるGetメソッドを外から差し込んで利用します。

“`golang
// main.go 1つ目のファイル
package main

import (
“fmt”
“net/http”
)

type A struct {
Name string
}
type AIf interface {
Get() string
}

func main() {
a := A{“本物”}
s := Example(&a)
fmt.Println(s)
}

// ★テスト対象メソッド
func Example(a AIf) string {
s := a.Get()
return s
}

func (a *A) Get() string {
_, _ = http.Get(“yahoo.co.jp”)
return a.Name + “のGetメソッド”
}
“`
**main実行結果**
本物のG

元記事を表示

go mod tidyでgitlabのリポジトリimportが失敗する

# はじめに
本記事はあくまで個人のタスクにおける備忘録としての投稿であり、細かい設定条件や開発環境の記載は省略しています。

# 事象
`go mod tidy`で依存関係を整理しようとした際に
“`terminal
fatal: could not read Username for ‘https://gitlab.***/***/***.git’: terminal prompts disabled
Confirm the import path was entered correctly.
“`
というエラーが出て失敗する。

# 調査
1. エラー内容をそのままググる
するとこういう記事がヒットする
https://jnst.hateblo.jp/entry/2016/10/17/210612

要はgitのレポジトリへのアクセスをする際に権限がないため怒られているとのこと。

2. 現状の`.gitconfig`を見てみる。
“`
[credential]
helper = !aws codecommit credential-hel

元記事を表示

Goでbuild constraintsを使ってビルドを分ける

Goではbuild constraints(build tagsとも呼ばれる)を利用することで、異なるビルドを作り分けることができます。
この機能を利用することで、デバッグ用とリリース用や無償版と有償版といった複数のバリエーションのビルドを作ることができます。

## 本記事でのGoのバージョンについて

本記事ではGo 1.17以降を対象とします。

build constraintsの書き方はGo 1.17から変更になったのですが、1.16は既にサポートされていないバージョンなので、本記事でも扱わないこととします。

詳細については https://go.dev/design/draft-gobuild を見るようにとリリースノートにもあるので、以前の記法と「なぜ変更になったのか」が気になる方はそちらを御覧ください。

## build constraintsの付け方

build constraintsは以下のようにファイルの先頭に`//go:build 条件`という形式のコメントを書きます。

条件の部分は単純にタグ名を指定する以外にも、if文のような`(A || !B)`のよ

元記事を表示

CircleCIでGo1.19とgcoudコマンドを使用できる環境を作成する方法

## 概要
GoのAPIテストをCircleCIと連携する際に詰まったので備忘録として投稿します。

### 要件
今回の用件として、GCPのサービスアカウントを使用すること、Goのバージョンを1.17以上にすることがあります。
また、GCPのサービスアカウントを使用する際に`gcloud`コマンドを使用するので、Go1.17以上 + gcoudコマンドを使用できる環境が必要です。(厳密には[こちらのコマンド](https://cloud.google.com/sdk/docs/authorizing?hl=ja#authorize_with_a_service_account)を使用したいと思っています)
筆者が調べた限りでは、Go1.17以上で`gcloud`コマンドを使用できるDocker imageは見つからなかったので自作で環境を構築する必要がありそうでした。

###### GCPのサービスアカウントを使用する理由
テスト実行時にGCPと連携する必要があるためです。
###### GOのバージョンが1.17以上である理由
実装の都合上なのでCircleCIとの連携に深く関係

元記事を表示

OTHERカテゴリの最新記事