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

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

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(“/”

元記事を表示

oapi-codegenでHash Map (additionalProperties) はどうexportされるか

Go言語で Open API 3.0対応の型情報を生成するとき、
[github.com/deepmap/oapi-codegen](https://github.com/deepmap/oapi-codegen)
を使ってます。

あまりユースケースとしてやりませんが、マップを表現したい時があると思います。
Dictionaries/HashMaps の仕様はこれです。
[Dictionaries, HashMaps and Associative Arrays](https://swagger.io/docs/specification/data-models/dictionaries/)

oapi-codegenの公式のReadmeでは、additionalPropertiesに関しては[一応対応している](https://github.com/deepmap/oapi-codegen#additional-properties-in-type-definitions)と書いてますが、
定義が実際にどう構造体として出力されるか見てみました。

### 定義

“`

元記事を表示

SpannerにおけるMutationの数え方

SpannerのMutationの数え方を調べたのでメモ

# Mutation
MutationはDBへの操作(Insert・Update・Delete)の単位として使われる言葉

Transactionを使ってアトミックに複数のMutationをまとめて実行する際には20kMutation問題を意識する必要がある.
20kMutation問題とは,一つのTransactionで扱えるMutationが2万個までという制限のこと.

# Mutationの罠
spannerパッケージにあるspanner.Mutationはコード上でInsertやUpdateなどの処理の単位を表しているが, Spannerの内部ではもっと細かい処理の単位に分解されるらしく, コード上で扱うspanner.Mutationの数を数えても20k制限対象のMutationの数とは一致しない.コードのMutationの数が20000個以下ならOKとかそういうことではない.

“`golang
func write(w io.Writer, db string) error {
ctx :=

元記事を表示

GoのHOTリロード機能(air)付きコンテナの環境構築

Goはコンパイラ言語なので`go build`でコンパイルが必要だが、パッケージを導入することでフロントエンドの yarn run watchみたいなHOTリロードができるらしい。

https://github.com/cosmtrek/air

https://github.com/oxequa/realize

調べてみたところ、realiseは2018年以降メンテされてない様子。。。
最近はメンテナンスが続いてる`air`の方が導入事例が多いようなので、air導入済みのgo環境をを作ってみました。

### 作成する環境
– Go v1.16
– air v.1.27.3

2021年10月末時点ではGo v1.17が出ているのですが、airのGo対応状況が~1.16のため、合わせて下げています。

今回作成した環境のリポジトリ

https://github.com/hiro-lapis/go-docker

### ファイル構成
最終的なファイル構成は以下のとおりです。

“`
src

├── app
│ ├── .air.toml
│ └── main.go

元記事を表示

golangのTimeについて

これ「なんでそんなこと思ったの?」って言われそう。

も大したことはないですが、
「現在時刻を変数に入れたら、数秒たった後って時間って進むの?」
結論から言えば、`now := time.Now()`をした場合、
その時刻が変数nowに格納されて時間経過で変化がないです。

以下、検証コード。

“`golang
package main

import (
“fmt”
“time”
)

func main() {
now := time.Now()
// 変数
fmt.Println(“before :”, now.Format(“2006-01-02T15:04:05Z07:00”))
// Timeオブジェクト
fmt.Println(“beforeNow :”, time.Now().Format(“2006-01-02T15:04:05Z07:00”))
fmt.Println(“2秒待ちます”)
time.Sleep(time.Second * 2)
// 変数
fmt.Println(“after :”, now.Format(“20

元記事を表示

OTHERカテゴリの最新記事