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

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

【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

元記事を表示

Raspberry Pi でブロックチェーンの実証実験を行う(その2)


【1960年生まれのおじさん日記】
 60歳の定年退職後に再就職した現在の職場で ≪STM32(32bit汎用マイコン)≫でプログラム作成を
 依頼され その後もRaspberry Pi でブロックチェーンを構築してと言われ 分からないことだらけ!
 一応は、若いころから 製造業で働き 制御用ソフト や アプリケーションの作成をしたこともある
 けれども・・・

 この年齢になって Raspberry Pi でブロックチェーンの構築などするとは思わなかったおじさんの
 メモ書き記録。間違いも多々あるかと思いますが、お許しください。


**はじめに**
CQ出版社刊:「ラズパイで作るブロックチェーン暗号化コンピュータ(2020年3月1日 初版) を参考にして
ブロックチェーンの実証実験を行った。
[(その1)は、こちらから](https://qiita.com/ytetsuo/items/8ebfdfbafcbad61e9b73)

今回は、Windows側から / Raspberry Pi側から ブ

元記事を表示

Golang(Gobot+Firmata+Arduino)でアナログメーターを作ってみる

# Golang(Gobot+Firmata+Arduino)でアナログメーターを作ってみる

こんにちは、最近は色々検索していて、ブラウザのタブを開きすぎて、フリーズしがちな毎日です。
今回は PC の状態を視覚的に素早く認識できる CPU,Memory,Disk の使用率を可視化するアナログメーターを前から気になっていた Gobot 等を使って実践してみました。

成果物

https://github.com/Iovesophy/analog-meter-go

# Gobot セットアップ

Gobot とは

https://gobot.io/

> Next generation robotics/IoT framework with support for 35 different platforms

次世代 robotics/IoT フレームワークですね、
35のプラットフォームをサポートしている強力なライブラリです。

1. Golang をインストールする

https://golang.org/doc/

元記事を表示

Go言語でプライベートなGithubリポジトリにあるモジュールを利用し、DockerでBuildを行う方法

## 経緯

– Go 言語で開発したバックエンド API を Docker イメージにビルドしたい
– Go モジュールに社内で共有している非公開リポジトリにあるライブラリ(非公開ライブラリ)を含んでいる
– docker のイメージをビルドするとき、go mod download の箇所でライブラリにアクセスできないためエラーとなる

## 原因

– Docker ビルド時に Gitの認証情報を含んでいないため、非公開ライブラリにアクセスできない
– マイPCにはGitアカウントの認証情報があるため、ローカル環境では問題なく go install が行える

## 対応

– 秘密鍵を生成し、非公開リポジトリに公開鍵を設定する
– バックエンド API に、非公開ライブラリにSSH通信するための秘密鍵とSSHのconfigを配置する
– Dockerfile で 非公開ライブラリにアクセスするための設定を行う

秘密鍵をGitリポジトリにおくことに抵抗がある人は、github の secrets を利用するなりしてください

### 秘密鍵を生成し、非公開リポジトリに公開鍵を設定

元記事を表示

Raspberry Pi でブロックチェーンの実証実験を行う(その1)

【1960年生まれのおじさん日記】
 60歳の定年退職後に再就職した現在の職場で ≪STM32(32bit汎用マイコン)≫でプログラム作成を
 依頼され その後もRaspberry Pi でブロックチェーンを構築してと言われ 分からないことだらけ!
 一応は、若いころから 製造業で働き 制御用ソフト や アプリケーションの作成をしたこともある
 けれども・・・

 この年齢になって Raspberry Pi でブロックチェーンの構築などするとは思わなかったおじさんの
 メモ書き記録。間違いも多々あるかと思いますが、お許しください。


**はじめに**
CQ出版社刊:「ラズパイで作るブロックチェーン暗号化コンピュータ(2020年3月1日 初版) を参考にして
ブロックチェーンの実証実験を行った。
この書籍に記載されている流れが私にとっては、非常に理解し難いため ここに整理をして記載する。
※この記事を見ただけでは、出来ません!!
※是非、「ラズパイで作るブロックチェーン暗号化コンピュータ」を購入した上で参考に

元記事を表示

【Golang】ラズパイ+ go-sdl2 で /usr/bin/ld: -liconv が見つかりませんエラー【静的リンクのビルド時】

# `/usr/bin/ld: cannot find -liconv` on go-sdl2 static build

> デスクトップ環境(X11)なしの RaspberryPi OS Lite 入りラズパイでスクリーン描画したい。
> [SDL](https://ja.wikipedia.org/wiki/SDL) という X11 の代替となるマルチメディア用のライブラリにスクリーンの描画機能があるらしい。ところが Go 言語(以下 Golang)で SDL を利用するために [go-sdl2](https://github.com/veandco/go-sdl2) を使うも、静的リンクでビルドすると「lib-iconv が見つかりません」とエラーが出るのです。
> でも `static` タグなし(`go build .`)だと、ビルドできるし、ターミナルに描画はできるのです。どうしよう。

“`shell-session:静的リンクでビルドするとエラーが出る
$ go build -v -tags static -ldflags “-s -w” .
github.com/

元記事を表示

go buildはできるのに、VSCodeでgolangのimportがエラーと表示される

めちゃくちゃ詰まったのでメモ。

## 事象

`go build`, `go run hoge.go`は正常に動くのに、VSCode上でimportが解決できないとエラーが表示される。

## 原因
VSCodeで複数のgoのリポジトリを開いているのが原因っぽいです。

“`
VSCodeで開いているフォルダ
└ リポジトリその1
└ リポジトリその2
“`

と開くと、`gopls`がうまく動かないみたいです。
(疲弊しきって深掘りする気力がなかった・・・)

新しいウィンドウでひとつのリポジトリを開いたら解決しました。

複数のgoのリポジトリをひとつのウィンドウで開きたい場合は、
リポジトリその1をはじめに開いたあと、`Files > Add Folder to Workspace…`にて対応するとよさそうです。

こんな使い方してたの自分だけなのかな・・・

元記事を表示

http.ListenAndServeTLSでサーバが起動できずハマったが、エラー出力を自分で書いたらすぐに解決した

# 概要

Go初学者(私)が『[Go プログラミング実践入門](https://www.amazon.co.jp/Go%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B-impress-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Sheong-Chang-ebook/dp/B06XKPNVWV/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=go&qid=16355897

元記事を表示

FreeBSDで AWS Session Manager Plugin を導入してみる

# FreeBSDでAWSセッションマネージャープラグインを導入してみる

## はじめに

[AWS Systems Manager Session Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html)とは、

– 「AWSシステムマネージャー」サービスの一つであるところの、「セッションマネージャー」という機能である。
– これはAWS管理コンソールやAWSCLi等によりEC2等のインスタンスにアクセスまたはログインするための機能である。
– この機能を使用してインスタンスへアクセスすると、(グローバルIPでの)受信ポートの維持や、踏み台サーバーの用意、SSH鍵の管理が不要になる。
– バックエンドで稼動するインスタンスが多く、グローバルに公開して無い場合や、孤立した、いわゆるプライベートネットワーク内に設置されたサーバーにアクセスする場合に嬉しい、あるいは必要となる機能である。
– この機能の利用にあたり、対となる [Session Mana

元記事を表示

Go言語 stringsパッケージ

#文字列チェック

#####■文字列に「,」が含まれているかをチェック

“`go:
if strings.Contains(“red,blue”, “,”) {
fmt.Println(“複数”)
} else {
fmt.Println(“単数”)
}

// 複数
“`

#文字列変換

#####■「,」区切りの文字列を配列(スライス)に変換

“`go:
colorArr := strings.Split(“red,blue”, “,”)
for _, v := range colorArr {
fmt.Print(v + “\n”)
// red
// blue
}
“`

元記事を表示

OTHERカテゴリの最新記事