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

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

[VScode] Docker+Go+air+delveでリモートデバッグ

## はじめに
Docker上で動いているGo言語のアプリケーションを、Vscodeでリモートデバッグします。
その際に、デバッガツールの [delve](https://github.com/go-delve/delve) と、ホットリロードツールの [air](https://github.com/cosmtrek/air) を使います。

## ディレクトリ構成

“`
├── .vscode
│ └── launch.json
├── cmd
│ ├── .air.toml
│ ├── go.mod
│ └── main.go
├── Dockerfile
└── docker-compose.yml
“`

## Dockerfile
まず、Dockerで以下の2つをインストールします。

“`Dockerfile
FROM golang:1.17.2

RUN go install github.com/go-delve/delve/cmd/dlv@latest

RUN go install github.com/cosmtrek/air@

元記事を表示

Golang 標準パッケージ ~os.Exit()~

## はじめに
最近Go言語の勉強を始めて、ここに学んだことをアウトプットとして書いていければいいかなと思います。
諸学者なので、間違い等あるかもしれませんが、外期は優しく指摘してくれるとありがたいです。

なお、Goの基礎的なところに関しては、既に記事がたくさんあったので今回は標準パッケージの `os` について書いていこうかと思います。

### os.Exit()
* プログラムを終了することができる。
* `os.Exit()`以降に記述されたプログラムは実行されない。
* 引数には、ステータスを渡すことができる。
* defer文も実行されないので注意する

引数の種類は、
0だと成功を示して、0以外はエラーを示す。

“`main1.go
package main

import (
“fmt”
“os”
)

func main() {

os.Exit(1)
fmt.Println(“Start”)
}
“`
“`main2.go
package main

import (
“fmt”
“os”
)
func main() {
//

元記事を表示

【Go】自動生成されたdocument idを取得したい【Firestore】

Goにて、Firestoreのデータをクエリで引っ張ってくるときに、document idを取ってくる方法がなかなか見つからなかったので、自分の備忘録です。

#結論
iter.Next()した結果は「DocumentSnapshot」になる。
doc.Ref.ID でdocument idを取ってこれる。

“` go
iter := client.Collection(“activities”).Where(“Date”, “==”, v).Documents(ctx)

var result []interface{}
for {
doc, err := iter.Next()
if err == iterator.Done {
break
}
if err != nil {
fmt.Fprint(w, err)
return
}
fmt.Println(doc.Ref.ID)
m := doc.Data()
m[“id”] = doc.Ref.ID
result = append(result, m)
}
“`

#参考
https://pkg

元記事を表示

Go言語からArgoCDのApplication CustomResourceを作成する例

# argocd v1alpha1.Application構造体を生成する

まず、Application構造体を生成します。SourceやDestinationなどに指定するパラメタはYAMLでApplicationを書いているときと同じです。

“`golang
app := &v1alpha1.Application{
ObjectMeta: metav1.ObjectMeta{
Name: “myapp”,
Namespace: “argocd”,
},
Spec: v1alpha1.ApplicationSpec{
Source: v1alpha1.ApplicationSource{
RepoURL: “”,
Path: “”,
TargetRevision: “”,
Helm: nil,
Kustomize: nil,
Ksonnet: nil,
Directory: nil,

元記事を表示

Goのデバッグ方法

#ステップ

###1ターミナルを見る

###2ファイル名と行が書かれているのでその箇所を検索してその該当箇所にいく

###3fmt.Printf(“%v”, 表示させたいもの)をする

#本番環境では出来てローカルでは出来ない理由

コードは同じはずなので環境変数の問題かな

元記事を表示

Go言語でKubernetes関連開発時に unknown revision v0.0.0 エラーが発生した時の対処

# コンパイルエラー全体

“`
go: finding module for package github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned
go: found github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned in github.com/argoproj/argo-cd/v2 v2.1.6
go: github.com/argoproj/argo-cd/v2@v2.1.6 requires
github.com/argoproj/gitops-engine@v0.4.1 requires
k8s.io/kubernetes@v1.21.0 requires
k8s.io/api@v0.0.0: reading k8s.io/api/go.mod at revision v0.0.0: unknown revision v0.0.0
“`

# 対処方法

`go.mod` にk8s.io関連のバージョンを固定で指定する。K

元記事を表示

gorm.Model の時刻型の timezone が JST にならない

## はじめに
gorm.Model の timezone が UTC から JST にならず、小一時間頭を悩ませたため、その過程で得たものをアウトプットします。
Go(gorm) + PostgreSQL を使っている方が対象です。

## 環境
– Go 1.17.1
– PostgreSQL 13.4
– Gorm v2

## 結論
PostgreSQL の時刻カラムの型が、timestamp(without time zone) だったことが原因でした。
(結論だけ知りたい方向けです)

## 解決の流れ
### gorm.Model の仕組み
まずは gorm.Model の仕組みをサラッと解説します。

“`go:go
type Model struct {
ID uint `gorm:”primaryKey”`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:”index”`
}
“`
gorm.Model とは、gorm

元記事を表示

Helmチャート(Go Template)のループの中で上位スコープの変数を参照する方法

# 概要

ループの手前で変数を定義し、それを参照します。

# 例

まずvalues.yamlの変数を定義

“`yaml
repository:
username: craftsman-software
name: focas

branches:
– name: main
project: focas
service: web
environment: prod
– name: prototype
project: focas
service: web
environment: prototype
“`

“`yaml
# ループの前で変数定義
{{ $repositoryFullName := printf “%s/%s” .Values.repository.username .Values.repository.name }}

apiVersion: triggers.tekton.dev/v1alpha1
kind: EventListener
metadata:
name: eventlist

元記事を表示

macの買い替えとともにgoの再インストール

## SHELLの確認
macOSがCatalina以後はデフォルトシェルが「zsh」に変わる

Catalina以前

“`
$ echo $SHELL
/bin/bash
“`

Catalina以後

“`
$ echo $SHELL
/bin/zsh
“`

## [goenv/INSTALL.md](https://github.com/syndbg/goenv/blob/master/INSTALL.md)の手順通りにコマンド実行

“`
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
“`

## ~/.zshrcに追記

vi とかで適当に開いて下記を追記

“`
export GOENV_ROOT=$HOME/.goenv
export PATH=$GOENV_ROOT/bin:$PATH
eval “$(goenv init -)”
“`

## インストール出来るGoのバージョンを確認

“`
$ goenv install -l
Available versions:
1.

元記事を表示

Go の気になったコミット (2021 年 10 月)

[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。

前回作成したリストはこちら。

https://qiita.com/sg0hsmt/items/1f75fa66d0f7d0f77d7f

軽く説明を追加していますが勘違いや誤りがあるかもしれません。

## Topic

– ジェネリクスで使用するタイプパラメータに interface{} を省略してそのままタイプセットを書けるようになりました。
– 文字列を 2 つに分割する strings.Cut が追加されました。
– ビルドしたバイナリにバージョン管理情報やビルド時の指定が埋め込まれるようになりました。
– パフォーマンスを理由として wasm で使用される syscall/js から js.Wrapper が削除されました。
– Go に workspace サポートが追加されました。
– sync.Mutex にロックされている場合はブロックせずに戻ってくる TryLock メソッドが追加され

元記事を表示

M1 MacとIntel Macの両方に対応したコマンドを作る

Go言語を使って、M1 MacとIntel Macの両方に対応したコマンドの作り方。

[なでしこ3配布キット](https://nadesi.com/doc3/go.php?16421)で、mac用のバイナリは、ユニバーサルバイナリとした。作り方を忘れそうだったのでここにメモ。

# 最初にMacで対応アーキテクチャを調べる方法

`file`コマンドで確認できる。

“`
$ file (コマンド)
“`

例えば以下のように表示される。

“`
% file nadesiko3
nadesiko3: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64]
nadesiko3 (for architecture x86_64): Mach-O 64-bit executable x86_64
nadesiko3 (for architecture arm64): Mach-O 64-bit executable arm64
“`

# G

元記事を表示

Go言語のテンプレートでテンプレート構文を無視する

Go言語のテンプレートはHelmやHugoなどで使われています。

テンプレートの中でテンプレート構文が使われているときに、たとえば下記のようになっている場合です。このとき、シングルクォート内の`{{.Request.Method}}`は無視したいものとします。

通常何もしないとテンプレートのレンダリング時にテンプレートとして解釈されてしまいます。

“`
logging: ‘{{.Request.Method}}’
“`

その部分を無視したいときには下記のようにします。

“`
logging: ‘{{“{{“}}.Request.Method{{“}}”}}’
“`

こうすることによって、初回のレンダリング時には`{{“{{“}}`が解釈され、結果`{{`が出力されます。`}}`部分も同様です。

元記事を表示

Go 日付ローテートログ

“`
package daylog

import (
“log”
“os”
“time”
)

type DayLogger struct {
logger log.Logger
postFileName string
yyyymmdd string
}

func NewDayLogger(postFileName string) *DayLogger {
yyyymmdd := getYMD()
fileName := yyyymmdd + “_” + postFileName
logfile, _ := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0777)
logger := *log.New(logfile, “”, log.Ldate|log.Ltime)

return &DayLogger{
logger: logger,
postFileName: postFileName,
yyyymmdd: yyyymmdd,
}

元記事を表示

Goのtime型で過去300分の時間を出力

# 概要
goで過去300分の時間を出力するプログラムです。
goの文字列からtime型への変換で手間取ったため、備忘録ととして残しておきます。

“`golang:main.go
package main

import (
“fmt”
“strconv”
“time”
)

func main() {
t:= time.Now()
fmt.Println(t)

for i := 1; i < 300; i++ { s:= strconv.Itoa(-i) // iを文字列型に変換 m, _ := time.ParseDuration(s+"m") // 文字列型を時間に変換 t2 := t.Add(m-time.Minute) // 時間を引く fmt.Println(t2) } } ``` #参考元 >https://pkg.go.dev/time#example-Duration.Minutes

元記事を表示

[A Tour of Go] Exercise: Mapsの自分の解答

“`go
package main

import (
“golang.org/x/tour/wc”
)

func WordCount(s string) map[string]int {
words := make(map[string]int)
var wordstorage string
for i:=0; i < len(s); i++ { if s[i:i+1] == " " { words[wordstorage] += 1 wordstorage = "" } else { wordstorage += s[i:i+1] } } words[wordstorage] += 1 return words } func main() { wc.Test(WordCount) } ```

元記事を表示

【Go言語】interface定義内に別のinterfaceを埋め込む

# net/httpライブラリで気になる記述を見つけた
[net/http]()のGETを使ってレスポンス本体の内容を操作する、といったコードを書いていた時、
ふとResponse.Bodyの型を見てみるとio.ReadCloser interfaceが指定されていた。

“`response.go
type Response struct {
/// ~~~ 省略 ~~~

Body io.ReadCloser

/// ~~~ 省略 ~~~
}
“`

こいつのinterface定義を見てみるとこのように定義されていた。

“`io.go
// 定義①
type ReadCloser interface {
Reader
Closer
}
“`

こんな感じのinterface定義は見るけど、上記のような定義はあまり見たことがなかったのでちょっと調べてみた。

“`io.go
type Writer interface {
Write(p []byte) (n int, err error)
}
“`

# interfa

元記事を表示

goenvで最新のGoをインストールできない時にやったこと

## はじめに
Goのバージョン管理をgoenvを使ってやっているのですが、goenvを使って最新のGoがインストールできなかったので、その対処方法をまとめました。

## goenvでのバージョン管理
goenvを使っている場合、指定のバージョンのGoをインストールするために以下のコマンドを使います。

### インストールできるバージョンの確認
“`shell
$ goenv install -l
Available versions:
1.2.2
1.3.0
1.3.1
1.3.2
1.3.3
    .
.
.
1.11.1
1.11.2
1.11.3
1.11.4
1.12beta1
“`

ここで新しいバージョンのGoをインストールできないことに気がつきました。

### 指定のバージョンをインストール
“`shell
$ goenv install 1.11.4
“`

## 解決方法
自分はgoenvをHomebrewで管理していて、Homebrewを使ってgoenvをアンインストール、そして再インストールしてもう

元記事を表示

【Go言語】Tips・記事

#### 書式指定子
https://qiita.com/Sekky0905/items/c9cbda2498a685517ad0

#### ファイル操作
https://golang.hateblo.jp/entry/2018/11/09/163000

元記事を表示

LINE BOTを使って疑似彼女を錬成するレシピ

## はじめに

最近寒くなってきましたね〜、そしてもうすぐクリスマス!
世のカップルを爆撃するのを楽しみにしております ☆ wkwk

![depositphotos_320979774-stock-photo-closeup-of-red-baubles-hanging.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170923/842822db-96a8-a74c-b81c-809f5dc2f579.jpeg)

そんな寂しい僕のお供としてLINE BOTを作ってみましたので、今年のクリスマスは一緒に過ごそうと思います ♡

## 紹介すること・しないこと

**紹介すること**
– アプリケーションの構成
– BOTの仕様
– DB設計
– プログラム、及びその解説
– **採用PR** (ぜひ最後のページまで見ていって下さい!)

**紹介しないこと**
LINE DeveloperサイトでのLINEアカウントの作り方は省略させて下さい。すいません > < ## 構成 自前で用意したサーバが

元記事を表示

【Go言語】ポインタ【まとめ】

# Goのポインタとは
ある変数のアドレス(メモリの番地)を示すもの。(=その変数の値がどこに格納されているかを示すもの。)

# ポインタを操作する二つの演算子(&と*)
## アドレス演算子(&)
変数名に前置することで、その値が格納されているメモリ内アドレスを取得できる。

“`go
num := 5
fmt.Println(&num) // 0xc0000100a0
“`

## デリファレンス演算子(*)
メモリアドレスで参照される値を取得できる。(=メモリアドレスに格納されている値を取得できる。)

“`go
num := 5
address := &num
fmt.Println(address) // 0xc000100010 参照先見る
fmt.Println(*address) // 5 デリファレンスしてメモリに格納されている値を見る
“`

後述のポインタ型をデリファレンスすることで値の書き換えもできる。

“`go
var lang *string

mainLang := “Go”
lang = &mainLang
fmt.Println(*l

元記事を表示

OTHERカテゴリの最新記事