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

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

KubeLinterを動かすKustomizeのプラグインを作る

# はじめに

最近、自動化に関する話題を多く聞きます。私も何か使えるようになりたいと思い、k8sリソースの静的な解析ツールであるKubeLinterを使ってみました。Kustomizeのプラグインとしたかったのですが、方法が載っていなかったので作ることにしました。慣れないGoで作りましたので、つたない部分はご了承ください。

# KubeLinterとは

KubeLinterはk8sのマニフェスト(yaml形式)をベストプラクティスに則ってチェックするツールです。チェックするルールはカスタマイズすることができ、ルールを守っていなければエラーでデプロイしないようにできます。ルールを守らなければ以下のようなエラーになります。

“`bash
pod.yaml: (object: /security-context-demo /v1, Kind=Pod) container “sec-ctx-demo” does not have a read-only root file system (check: no-read-only-root-fs, remed

元記事を表示

ChatGPTのAPIをGolangで実装する

“`golang
func GenerateText(apiKey string, message string) string {
url := “https://api.openai.com/v1/chat/completions”

jsonStr := []byte(fmt.Sprintf(`{
“model”: “gpt-3.5-turbo”,
“messages”: [{“role”: “user”, “content”: “%s”}]
}`, message))

req, err := http.NewRequest(“POST”, url, bytes.NewBuffer(jsonStr))
if err != nil {
panic(err)
}

req.Header.Set(“Content-Type”, “application/json”)
req.Header.Set(“Authorization”, “Bearer “+apiKey)

client := &http.Client{}
resp, err := clie

元記事を表示

Go言語で使う「go.opencensus.io/trace」とは?

### はじめに

`go.opencensus.io/trace`は、分散トレーシングのための`Go`言語向けのオープンソースライブラリ`OpenCensus`のトレースパッケージの一部です。トレースは、分散システム内で複数のサービスが相互作用する際に、特定のトランザクションやリクエストがどのように処理されているかを理解するために使用されます。

`OpenCensus`トレースは、アプリケーションのインストゥルメンテーション(計測コードの追加)に依存して、分散システム内の各リクエストに対して一意のトレースIDを作成し、そのトレースを構成するすべての要素(リクエスト、サブリクエスト、レスポンスなど)を関連付けます。トレースのデータは、分散トレーシングシステムによって集約され、可視性の高い視覚化やトラブルシューティングを支援するために使用されます。

### コード説明
下記は`OpenCensus`トレースを使用して`HTTP`リクエストをトレースする`Go`言語のサンプルコードです。
このコードは、クライアントが`Web`サイトにリクエストを送信するときに、リクエストの処理時間とエ

元記事を表示

[Go]埋め込み

# 概要
とあるPRで、構造体をインターフェース化するように言われたけど、愚直に実装しようとすると処理が共通なところ多いなぁ・・・なんとかできないかなぁ・・・と調べているとで、Goだと埋め込み(embed)がこの事態の解決にもっともふさわしそうということで、マジメにまとめてみた。

# 埋め込み
Goで「委譲」を実現する機能。

以下サンプルコード。[The Go Playground](https://go.dev/play/p/gO_wFX5Kqb4)

“`// You can edit this code!
// Click here and start typing.
package main

import “fmt”

// definition StructA 埋め込み先の構造体
type StructA struct {
FieldA int
*StructB // 埋め込んだ構造体名と同名のフィールドを持つことになる
FieldC int
*StructZ
}

func (s *StructA) Print2() {
fmt.Printf(“e

元記事を表示

Go言語で説明する「抽象化」について

Go言語では、インターフェースを使用して抽象化を実現します。
インターフェースは、メソッドの集合体であり、そのメソッドのシグネチャー(引数の型、戻り値の型など)を定義します。
具体的な型は、そのインターフェースを実装することで、そのインターフェースを満たすことができます。

以下は、簡単な例です。
`Animal`というインターフェースを定義し、そのインターフェースを実装する`Dog`と`Cat`という2つの具象型を定義します。 `MakeSound()`メソッドは、`Animal`インターフェースで定義されたメソッドであり、どちらの具象型でも異なる音を出すように実装されます。 `main`関数では、`MakeSound()`メソッドを呼び出すことにより、`Dog`と`Cat`の両方が異なる音を出すことが確認できます。

“`go
package main

import “fmt”

type Animal interface {
MakeSound()
}

type Dog struct{}

func (d Dog) MakeSound() {
fmt.Pr

元記事を表示

[Go]インターフェース

# 記事を書いたきっかけ
インターフェースってなんか実装複雑になるし、利用しなくて済むならそうしよ!と思考停止していたが、実務のPRレビューで「ここはインターフェース化すべき」とコメントされたので、これを機に勉強して整理することにした。
クリーンアーキテクチャやらDDD関連の書籍を読むときも、インターフェースからは逃れられないしね・・・。

# Goのインターフェースの効果
以下を満たすと、 **インターフェースの変数に格納されている別々の構造体(のポインタ)型のメソッドを、 **暗黙的な型変換**をさせた上で実行させることができる(★)**

– 構造体ごとに共通のふるまいをインターフェースで定義
– インターフェースを満たす構造体インスタンス(のポインタ)をインターフェース型の変数に代入

これにより、★部分のメソッドの実行で場合分けをする必要がなくなり、プログラムの柔軟性、コードの再利用性を向上させることができる。

# Goのインターフェースの特徴
– インターフェースの実装は暗黙的であり、インターフェースで定義されているメソッドが実装されている構造体 = インターフェースが満

元記事を表示

LDOCE5の音声データやテキストを抽出してAnkiに取り込めるようにするソフトを作った話

![スクリーンショット 2023-03-04 103524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3234973/05d3175a-07bb-b308-7dc5-81f8a56a8e6b.png)

## セットアップ
https://www.amazon.co.jp/%E3%83%AD%E3%83%B3%E3%82%B0%E3%83%9E%E3%83%B3%E7%8F%BE%E4%

元記事を表示

実用Go言語 付録A 駆け足で学ぶGoの基礎を読んでいく

# 実用Go言語を読んで、どんどんメモをしていく記事です。

![image](https://user-images.githubusercontent.com/14310228/165003929-7074bdab-ff44-4476-8367-f1bd09f310cb.png)

これからGoを勉強する人にも参考になるような記事を書けたら嬉しく思います。
本文の引用やソースコードを引用しつつ、メモを残していくようなスタンスの記事にします。

## リンク
[実用 Go言語 O’Reilly Japan](https://www.oreilly.co.jp/books/9784873119694/)
[実用 Go言語 サポート用リポジトリ ](https://github.com/oreilly-japan/practical-go-programming/)
[Effective Go(日本語) ](http://go.shibu.jp/effective_go.html)

## Hello World
最低限、文字を画面に出力するコードを書きます。
Goがインストールされてい

元記事を表示

gomockを使ってio.Readerを引数に取るメソッドをモックする

# 概要
`gomock`を使用して`io.Reader`を引数に取るメソッドをモックするテストを書きました。
公式ライブラリでは`io.Reader`を使用するメソッドが多く存在し、利用する場面でもそれらをそのまま受け渡したいケースも時には存在すると思います。検索をすると自作の`matcher`を使用するなど複雑なやり方が載っていますが`strings.NewReader()`を使用して`io.Reader`型の引数を作成することで通常の引数の確認と同様にテストを作成できました。備忘録を兼ねて投稿します。

# 方法

下記のようなメソッドがあったとします。`mockgen`を使用することでモックを作成しています。

“`go:sample_repository.go
package usecase

import “io”

// go:generate mockgen -source=$GOFILE -package=$GOPACKAGE -destination=mock_$GOFILE
type SampleRepository interface {
Read(r io

元記事を表示

今更WebAssembly体験、Goの画像生成プログラムをブラウザで動かす

# モチベーション

WebAssemblyが面白そうだと思いつつ、HelloWorldだと味気ないし、SQLiteを移植した、というようなものだと複雑すぎるということで、少し複雑なGoのプログラムを、ブラウザで動かすように変更してみて、雰囲気を掴みたいと考えました。

# Goのプログラムを書く

文字でHelloWorldのサンプルは味気ないということで、今回選んだのはGoで画像を生成するプログラムです。
以下の記事のプログラムをほぼそのまま利用しています(以下の記事では日本語を出すための内容が書かれていますが、その部分は今回はスルーします)

https://qiita.com/n-noguchi/items/566e83c5cc0d3b80852c

“`go
package main

import (
“bytes”
“fmt”
“image”
“image/png”
“os”

“github.com/golang/freetype/truetype”
“golang.org/x/image/font”

元記事を表示

入門GOプログラミング Lesson4~10

## 省略形式の変数定義
“`go
var count = 10
conut := 10
“`

#### for文の省略形式(C, Java, Javascriptと同じ構文)
“`go

for count := 10; count > 0; count– {
fmt.Println(count)
}
“`

## グローバル変数

“`go
var era = AD;// グローバル変数
func main() {
count := 10
for count = 10; count > 0; count– {
fmt.Println(count)
}
}
“`
省略形式による変数定義は使用不可

# Lesson5
練習問題 解答例
“`go
package main
import (
“fmt”
“math/rand”
)
func main() {
// 各チケットの要素の配列を定義する
spaceLineArr := […]string{“Virgin Galactic”, “SpaceX”, “Space Advent

元記事を表示

Goでテーブル駆動テストを実装する(入門編)

この記事では、Goでテーブル駆動テストを実装する方法について解説します。

### 1. テーブル駆動テストとは?
テーブル駆動テストとは、テストケースを表形式で表現し、テスト関数内でそのテーブルを反復処理してテストを行う方法です。
テーブル駆動テストを使用することで、以下のメリットがあります。

– テストの再利用性が高くなる。
– テストケースを効率的に記述できる。
– 入力に対し、出力に何を期待するかが簡単に理解できる。

### 2. テーブルとは?

テーブル駆動テストにおけるテーブルとは、テストデータを表形式で表現するための構造体のことです。

通常、以下のような形式で定義されます。
“`go
type Test struct {
name string // テスト名
input int // 入力値
expected int // 期待値
}
“`
この構造体を用いることで、テストケースを簡単記述することができます。
“`go
[]Test{
{“test case 1”, 1, 2},
{“test case 2”, 3,

元記事を表示

Go言語で説明する「ハリウッドの法則」

### はじめに
技術書を読んでいて気になった言葉を調べてみたシリーズ。

### 説明
「ハリウッドの法則」は、コンピューターサイエンスにおいて、特定のソフトウェアデザインの原則の1つです。この原則は、次のように言い表されます。「Don’t call us, we’ll call you.」つまり、あるソフトウェアコンポーネントが他のコンポーネントを直接呼び出すのではなく、必要に応じて情報を提供し、必要なタスクを外部のコンポーネントに依頼し、結果を受け取ることにより、コンポーネント間の依存関係を減らすことができるというものです。

この原則は、コンポーネントの疎結合を実現し、システム全体の柔軟性、拡張性、保守性を向上させることができます。例えば、あるシステム内である機能の変更が必要になった場合、ハリウッドの法則に従って設計されたシステムでは、その機能だけを変更することができ、他の機能に影響を与えることなく、システムを修正できるためです。

映画産業において、俳優が映画スタジオに自ら出向くのではなく、スタジオが必要な時に俳優に連絡することから名前がついたとされています。これは、ソフトウ

元記事を表示

入門GOプログラミング Lesson3 ループと分岐

## bool値
Python, Javascript:(””)データも”偽”とみなされるが、
Go:真の値は`true`だけ。偽の値は`false`だけ

“`go:
package main

import (
“fmt”
“strings”// 文字列を扱うパッケージ
)

func main() {
var command = “walk outside”
var exit = strings.Contains(command, “outside”)// commad文字列は”outsideを含むか(return bool)”
fmt.Println(“out cave”, exit)
}
“`
### if分岐
“`go:
package main
import (
“fmt”
)
func main() {
var age = 1
if age >= 20 {
fmt.Println(“飲酒喫煙OKです”)
} else if 10 < age && age < 20 { fmt.Println("飲酒喫煙NGです") } else {

元記事を表示

入門GOプログラミング Lesson2 偉そうな計算機

## 整形付き出力

標準出力
`Print` :
`Println` :
`Printf` : Print formatの略(だと思われる)
以下の使い方が可能
“`go:
fmt.Print(“Hello World”)
fmt.Println(“kgです”)// 自動改行付き
fmt.Printf(“私の体重は%v表面で%vkgです”, “Earth”, 70)//フォーマット指定子付き
“`

## テキストのアライメント調整
“`go
fmt.Printf(“%-15v $%4v\n”, “spaceX”, 94)// 右に15文字分パディングを設ける
fmt.Printf(“%-15v $%4v\n”, “Virgin Galactic”, 100)//左に4文字分パディングを設ける
“`

## 定数と変数

“`go:
const lightSpeed = 300000 // 定数定義
var distance = 1000000000 // 変数定義
“`
ショートカット定義も可能
“`go:
var (
distance =

元記事を表示

入門GOプログラミング言語 Lesson1 Hello world

# Go言語とは
– コンパイラ言語
– C++やJavaのように静的にコンパイルされる言語の安全性と性能を持ち、Pythonのような動的な型をもつインタープリタの軽さと楽しさがある言語
– メモリを効率よく使うことが容易で、エラーを起こしにくくなっている

## 私が学ぶ動機
将来的にサーバーサイドの主流になるといわれているGo言語をエンジニアとして学ばなければいけないと思ったから

## 開発環境
Go Playground
– https://goplay.tools/

### パッケージと関数

“`go
package main

import (
“fmt”
)

func main() {
fmt.Println(“Hello, 世界”)
}
“`

– `package` : ソースファイルのコード群のこと(Pythonでいうモジュールかな?)
– `import` : このコードが使用するパッケージを指定 `()`でくくる
– `main`パッケージの`main`関数から実行が始まる

“`golang:関数の定義
func main() {
fmt.Pr

元記事を表示

Go言語で値からポインタレシーバーのメソッドを呼べるのとポインタから値レシーバーのメソッドを呼べるのは理由が違うという話

仕様を眺めていたら「へー」となったので。

https://go.dev/ref/spec

## メソッドとかレシーバーとか

Goではレシーバーを持つ関数によってメソッドを定義する。

例えば、C++で

“`cpp
struct S {
void f(){}
};
“`

と書くところが、Go言語だと

“`go
type S struct{}

func (S) f() {}
“`

こうなる。

レシーバーは値でもポインタでも良い。関数のその他の引数と同じように、値ならコピーのコストが掛かるし、ポインタなら中身を書き換えられる(書き換えることができてしまう)。

“`go
package main

import “fmt”

type S struct {
x int
}

func (s S) incValue() { s.x++ }
func (s *S) incPointer() { s.x++ }

func main() {
s := S{x: 0}

s.incValue()
fmt.Printf(“%d\n”, s.x) //

元記事を表示

Golangのチュートリアル

## 必要事項

– golang 1.9のインストール
– VSCode

## golangの基礎

directoryを適当に作成してmainファイルを作成します。

“`
mkdir go-tutorial
cd go-tutorial && touch main.go

“`

今回はそのディレクトリプロジェクトのrootディレクトリにしたのでそのディレクトリのパスを通します。

“`
go mod init example/hello
“`

### 表示させる

まずはどの言語でもやるHello Worldから
goはprintさせるだけでもfmtライブラリーをインストールする必要があります。

実際に作ってみましょう。

Vscodeでプロジェクトのディレクトリを指定して開いてmain.goに以下のコードをコピペしてください。

“`golang:main.go
package main

import (
“fmt”
)

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

“`
下のコマンドを呼び出して動け

元記事を表示

Go: gorm で PostgreSQL のデータを削除 (Delete)

## プログラム

フォルダー構造

“`text
$ tree -a
.
├── .env
├── config_postgres.go
├── go.mod
├── go.sum
└── gorm_pg_delete.go
“`

“`go:gorm_pg_delete.go
// —————————————————————-
//
// gorm_pg_delete.go
//
// Mar/03/2023
//
// —————————————————————-
package main

import (
“fmt”
“os”
“gorm.io/gorm”
“gorm.io/driver/postgres”
)

/*
type City struct {
Id string
Name string
Population int
Date_

元記事を表示

Go: gorm で PostgreSQL のデータを更新 (Update)

## プログラム

フォルダー構造

“`text
$ tree -a
.
├── .env
├── config_postgres.go
├── go.mod
├── go.sum
└─ gorm_pg_update.go
“`

“`go:gorm_pg_update.go
// —————————————————————-
//
// gorm_pg_update.go
//
// Mar/03/2023
//
// —————————————————————-
package main

import (
“fmt”
“os”
“strconv”
“time”
“gorm.io/gorm”
“gorm.io/driver/postgres”
)

// —————————————————————-
fun

元記事を表示

OTHERカテゴリの最新記事