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

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

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

元記事を表示

Goland学習1日目

# Go言語とは
Googleが開発した言語
基本的にimportでパッケージを読み込み実行する
# 学習内容
## fmt
Cに似たprintf と scanf に似たフォーマット I/O 関数を実装する。

https://xn--go-hh0g6u.com/pkg/fmt/
## Println
fmt.Println()は引数の間にスペースを入れ、最後に改行文字 “\n” を出力します。 https://www.flyenginer.com/low/go/go%E8%A8%80%E8%AA%9E%E3%81%AEprint%E3%83%BBprintln%E3%83%BBprintf%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html

## 変数
### 宣言する方法

var 変数名 データ型
で変数のデータの型を漸減できる。

“`go:
var name string
name = “Jon”
“`

### 型推論

:= を使用することでデータ型の宣言せずに型推論でデータを自動で認識できる。

“`go:

元記事を表示

Go | MySQL | EC2 | RDS の環境構築

## 追記
この記事を書き終わってから、他の方々の記事を検索してみたのですが、AWS SDK for Goを使うのが一般的みたいです。
https://aws.amazon.com/jp/sdk-for-go/

この記事は、EC2を手動で作って、GoのコードをコンパイルしたバイナリファイルをEC2にアップロードする方法です。よろしくお願いします。

## やりたいこと
ゴールは、GoをEC2に、MySQLをRDSに配置して、GoからMySQLに接続できることです。

## Goアプリ
ローカルにGoは既にインストールされている前提です。
ちなみに、僕のGoのバージョンは1.16.6でした。
### ファイル構成
“`
.
├── go.mod
├── go.sum
├── init.sql
└── main.go
“`
### ファイル作成
usernameとappnameは適宜変更してください。

“`zsh:zsh
$ go mod init github.com/username/appname
$ go get github.com/go-sql-driver/mysq

元記事を表示

Add custom header to S3 CreateBucket request

Sample code for adding custom header to CreateBucket request.
AWS-SDK’s [CreateBucket](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#S3.CreateBucket “CreateBucket”) does not let you add custom headers so you have to create your own http request.

“`golang

import (
“fmt”
“log”
“net/http”
“time”

“github.com/aws/aws-sdk-go/aws/credentials”
v4 “github.com/aws/aws-sdk-go/aws/signer/v4”
)

func createBucket() {

endpoint := “https://xxx.xxx.xxx/”
region := “region-1”
bucketName :

元記事を表示

GO(Gorm) + MySQL 入門

# はじめに
次のPJではGOのGORMとMySQLを採用するとの事だったので、自分がmacで行ったハンズオン内容を簡易的にまとめた。

GORMって何?
[公式ドキュメント](https://gorm.io/ja_JP/docs/index.html)
 → Object-Relational Mappingの略。オブジェクトと関係(関係データベース、RDB)とのマッピングを行う。つまり、実際にSQL文を書かなくても、”直感的”にINSERT, SELECT, UPDATE, DELETEなど簡単にできちゃうイメージ。。。

実際に実機で動作確認を行うのが、早いので行った環境構築とCRUDのソースコードを追記していきます。

## 環境構築編

### MySQL
MySQLのインストール方法に関しましては、「brew mysql」で検索頂けると結構参考となる記事があるので割愛させて下さい(要望がありましたら追記致します)。

### Go ライブラリ
必要なライブラリを前もってインポートします。

“`
% go get -u gorm.io/gorm
% go get -u

元記事を表示

M1 MacとIntel Macのバイナリの見分け方とユニバーサルバイナリの作成

Apple M1 CPU と Intel CPU では
CPUアーキテクチャ(命令文やデータ形式)も異なり
バイナリファイル(実行可能なファイル)の中身も別物になる

※M1搭載のMacで従来(Intel CPU搭載Mac)向けのバイナリが実行できるのは
Rosetta 2というアプリケーションでM1向けバイナリに変換したものを実行しているため

また、macOSの実行ファイル形式[Mach-O](https://ja.wikipedia.org/wiki/Mach-O)では複数のアーキテクチャのバイナリを格納することが可能で
複数のアーキテクチャ向けバイナリを格納したバイナリをユニバーサルバイナリと呼んだりする

## バイナリファイルのアーキテクチャを調べる

`file ファイル名` コマンドで調べることができる

“`sh:
# Intel CPU向けバイナリの場合
$ file file ./foo/bar/hoge
./foo/bar/hoge: Mach-O 64-bit executable x86_64

# M1 CPU向けバイナリの場合
$ file ./foo

元記事を表示

GoとEC2で「Hello, World!」

## 追記
この記事を書き終わってから、他の方々の記事を検索してみたのですが、AWS SDK for Goを使うのが一般的みたいです。
https://aws.amazon.com/jp/sdk-for-go/

この記事では、EC2を手動で作って、GoのコードをコンパイルしたバイナリファイルをEC2にアップロードする方法です。よろしくお願いします。

## やりたいこと
GoとEC2を使って、ブラウザでHello, World!するだけです。
こちらの記事を大変参考にしました。
https://qiita.com/Dragon-taro/items/09a67b93093770348ce5

ローカルにGoは既にインストールされている前提です。
ちなみに、僕のGoのバージョンは1.16.6でした。

## Goアプリの作成
ファイル構成

“`
.
└── main.go
“`

“`go:main.go
package main

import (
“fmt”
“log”
“net/http”
)

func main() {
http.HandleFunc(“/”

元記事を表示

OTHERカテゴリの最新記事