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

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

go のわかりにくい型推論

# これは何?

go の型推論が思いがけない動作をしたのでその記録。

# 普通の例

“`go:go1.19
func main() {
f := func(i int) uint8 {
return uint8((1 << i) % 10) } fmt.Println("f(5) =", f(5)) //=> f(5) = 2
}
“`

$2^n$ を 10で割った余りを `uint8` で返すという普通の関数。

2の5乗 は 32 なので、 `f(5)` は 2 になる。順当。

# 思いがけなかった例

上記の関数 `f` に 10 を入れると

“`go:go1.19
fmt.Println(“f(10) =”, f(10)) //=> f(10) = 0
“`

$2^{10}$ は 1024 なので `f(10) = 4` となるかと思いきや、ゼロになる。

私は意外だった。

# いろいろ試した

## 一回変数で受ける

“`go:go1.19
f := func(i int) uint8 {
n := 1 << i return ui

元記事を表示

Goのdatabase/sqlを利用してPostgreSQL/MySQLへ接続&CRUD操作してみた

[「**Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る」**](https://amzn.to/3UI1wa3)という書籍を参考に、database/sqlを利用したデータベースへの接続とCRUD操作についてまとめました。

# PostgreSQLへの接続

### ドライバーのインストール

ドライバーをインストールする必要がある。

“`bash
go get “github.com/lib/pq”
“`

### 接続方法

“`bash
sql.Open(“postgres”, “user=ユーザー名 dbname=DB名 password=パスワード sslmode=disable”)
“`

# MySQLへの接続方法

### ドライバーのインストール

こちらも同様にドライバーをインストールする必要がある。

“`bash
go get -u github.com/go-sql-driver/mysql
“`

### 接続方法

“`sql
sql.Open(“mysql”, “ユーザー名:パスワード@tcp(ホスト:ポート番号

元記事を表示

「Go×Firebase×React」でJWT認証できる簡単なTODOアプリ作ってみた

こんにちは。初投稿です。
来年から新卒でエンジニアになる予定の者です。

## 初めに
実務未経験、独学ですので、何か勘違いがあるかもしれないということを予めご了承ください。間違いがあれば指摘していただけますと幸いです。

またこの記事ではDockerやReactなどの詳しいことは触れていません。

## この記事でやること
Go,Reactを学習したので習作物としてバックエンドGo,フロントエンドReactを使ったFirebase×JWT認証つきの簡単なTODOアプリを開発しました。

簡単にJWT(Json Web Token)だけ説明しますと、
* 認証用のトークンとして用いられる
* JSON形式でやり取りするため任意の情報を含むことができる
* 改ざんを検知できる
などの特徴があります

https://jwt.io/

こちらの記事がハンズオン形式でわかりやすかったです。↓

https://qiita.com/po3rin/items/740445d21487dfcb5d9f

# 完成イメージ
![TODO操作デモ.gif](https://qiita-image-st

元記事を表示

[OCI]Autonomous Database:Goで書かれたアプリケーションからAutonomous Databaseに接続してみた時のメモ

# はじめに
OSがOracle Linux 7.9のComputeインスタンスに、Go言語とOracle Instant Client、Go DRiver for ORacle(godror)をインストールしてAutonomous Databaseに接続してみた時のメモです。

# 1. GoとOracle Instant Clientのインストール

“`
sudo yum install -y oracle-instantclient-release-el7 oracle-golang-release-el7
sudo yum install -y git gcc golang
sudo yum install -y oracle-instantclient-sqlplus
“`
# 2. godrorのインストール

“`
go mod init github.com/godror
go get github.com/godror/godror@latest
“`

# 3. tnsnames.oraの作成

“`
mkdir /home/opc/tns
vi /ho

元記事を表示

Go Package 命名法

# Go Packageの命名方法

公式[GoのBlog Pacakge names](https://go.dev/blog/package-names?utm_source=dlvr.it&utm_medium=twitter)の(一部)和訳、まとめになります。

## 導入
いいパッケージの名前はパッケージの内容を示唆し、そのユーザーが内容や使い方を理解するのに役立つ。[Effective Go](https://go.dev/doc/effective_go#names)にパッケージ、タイプ、関数など名前の付け方のガイドラインがあり、それらをさらに拡張して議論します。悪い名前の付け方、その直し方も議論します。

## パッケージの命名

### いいパッケージの名前は短くて簡単なもの
Lower case (小文字) のみ
under_scores, mixedCaps がないもの

いい例
– time
– list
– http

悪い例
– computeServiceClient
mixedCapsは使うべきではない
– priority_queue
under_s

元記事を表示

GORMでUNIONを使用する際の注意点

# GORMでUNION?

GORMには、UNIONはサポートされていないので、Rawを使用する。
“`
db.Raw(“? UNION ?”,
db.Select(“*”).Model(&Foo{}),
db.Select(“*”).Model(&Bar{}),
).Scan(&union)
“`
https://stackoverflow.com/questions/67190972/how-to-use-mysql-union-all-on-gorm

# 問題

GORMでUNIONしようとした際に、
“`
db.Raw(“? UNION ?”,
db.Select(“*”).Model(&Foo{}).Order(“aaa”),
db.Select(“*”).Model(&Bar{}).Order(“aaa”),
).Scan(&union)
“`

“`
Error Code: 1054. Unknown column ‘aaa’ in ‘order clause’
“`
が発生。
aaaカラムは、ちゃんとあるのに。。。

#

元記事を表示

[Go] 定番(?)のじゃんけんゲームを作ってみた

# Go言語を使ってじゃんけんゲームを作ってみた!

## 目的 : Go言語の基本文法を確認

::: note info
INFORMATION

### インポートするライブラリ
+ __fmt__ : ターミナルへの出力用フォーマットライブラリ
+ __math/rand__ : ランダム値の生成
+ __strconv.Atoi__ : ターミナルからのstring入力(Ascii)をint typeに変換
+ __time__ : ランダム値の生成時に利用

### 環境
+ __macOSX__ : Montrey 12.6.1
+ __Goland__ : go1.19.3 darwin/amd64
+ __Visual Studio Code__ : 1.73.1

### 利用した文法
+ if 〜 else if 〜 else 文
+ ランダム値の生成
+ ポインタによる、値の更新
+ mapを使った連想配列(Pythonの辞書相当)
+ スライス機能

### ゲームの内容
+ コンピュータの手は、ランダム値から生成&決定
+ 5回実行して、結果を「○勝 ○敗

元記事を表示

goでパッケージ更新

## 概要
goで更新可能なパッケージを調べて、個別に更新する方法。

## 依存パッケージの確認
### 依存パッケージを全て出力

“`bash
go list -f ‘{{join .Deps “\n”}}’
“`

### 標準パッケージ以外の依存パッケージを出力

“`bash
go list -f ‘{{join .Deps “\n”}}’ | xargs go list -f ‘{{if not .Standard}}{{.ImportPath}}{{end}}’
“`

## 更新可能なパッケージの確認
### 全パッケージ
indirect(間接利用)のものも出力される。

“`bash
go list -m -u -mod=readonly all
“`

### indirectでないパッケージのみ
直接利用しているパッケージのみ出力。
出力結果の先頭にgo getを付けて出力することで、出力結果を使いやすくする。

“`bash
go list -m -u -mod=readonly -f ‘{{if (and .Update (not .Indi

元記事を表示

Goでjsのmapやfindなどを使いたい

## はじめに
jsでよくやっているこんな感じのコードをGoでも書きたい。けど外部のパッケージは入れたくない場合の対処法を紹介します。

“`ts
type Skill = {
name: string
}

const skills: Skill[] = [
{ name: ‘Ruby’ },
{ name: ‘Javascript’ },
{ name: ‘Python’ },
]
const py = skills.find(s => s.name === ‘Python’)
// => {name: “Python”}
console.log(py)

const names = skills.map(s => s.name)
// => (3) [“Ruby”, “Javascript”, “Python”]
console.log(names)
“`
## find
まず適当にsliceを用意。

“`go
package main

type skill struct {
name string
}

func main() {

元記事を表示

go言語でWindowsをシャットダウンする

## 結論

exec.Command を利用する

“`go
exec.Command(`shutdown`, “-s”, “-t”, “0”).Start()
“`

## 注意点

exec.Command だけではなく、以下を呼び出す必要がある(でなければ、コマンドは実行されない)
1. Output() // stdout
1. CombinedOutput() // stdout, stderr
1. Start() // プロセスの終了を待たない
1. Run() // プロセスの終了を待つ

引数について

“`go
exec.Command(`shutdown`, “-s”, “-t 0”).Start()
“`

では動かない。
どうやら、スペースで区切られたものをすべて切り出して引数にする必要があるらしい。(“-t 0” -> “-t”, “0” にしないと動かない)

元記事を表示

【Golang】Go で OpenPGP のペア鍵を生成する【GopenPGP】

> Go 言語(以下 Golang)で、[OpenPGP](https://ja.wikipedia.org/wiki/Pretty_Good_Privacy#OpenPGP) の公開鍵と秘密鍵を作りたいと思うも、[Go 公式のドキュメント](https://pkg.go.dev/golang.org/x/crypto@v0.2.0/openpgp)を見ると `Deprecated`(廃止)になっていて、ガチョーン。
>
> しかも、 `golang.org/x/crypto/openpgp` を使っていると [CVE-2022-27191](https://github.com/advisories/GHSA-8c26-wmh5-6g9v) の脆弱性を指摘される。

さらに、Go の公式は「[後継のパッケージは色々あるけど、私たちの方から『これがオススメ』というものはないよ](https://github.com/golang/go/issues/44226)」ときたもんだ。どうしよう。

## TL; DR (今北産業)

> 2022/

元記事を表示

AWS MediaLiveを使った擬似リニア配信方法 ~実践編~

# ? 擬似リニア配信(Virtual Linear OTT)とは?

擬似リニア配信とは、24時間/365日、番組表などのスケジュールに従って時間通りに配信する仕組みになります。事前に収録済み動画ファイル(mp4など)を使ってあたかも生配信しているかのようにライブ映像として流します。いわゆるケーブルTVみたいなものです。本資料ではMediaLiveのスケジュールアクション機能使った擬似リニア配信の実現とより実践で使える設定・設計について説明します。

注: MediaLiveをMLと省略して説明します。

## MLで実現するための流れ ~基礎編~

1. 動画ファイルをs3にアップロードする
1. MLチャンネルを作成する
1. スケジュールアクションを登録する

### 1.動画ファイルをS3にアップロードする

配信したい動画を事前にs3にアップロードします。
| ファイルパス | 用途 |
|:———–|:————|
| s3://demo-bucket/CM.mp4 | 本編動画を流す前の動画、今回は仮でCM(宣伝)動画 |
| s3://d

元記事を表示

Prometheus始めてみた #1 -概要から導入まで-

prometheusを触る機会があり,自分の環境で使ってみました.
本記事は「”Prometheus Up & Running”(Brian Brazil, O’Raily Media, 978-1-492-03414-8, 日本語版「入門 Prometheus」 オライリー・ジャパン」を参考にしております.

# Prometheusとは
正確には[公式ホームページ](https://prometheus.io/)の方が詳しいと思うので概要だけでも紹介します.
> Prometheusは,「オープンソースのメトリクスベースモニタリングシステム」.

と本には書いてありました.じゃあ,メトリクス,モニタリングって何?ってところから入りましょう.

### メトリクスとは
メトリクスはイベントから出された様々な情報を,扱える大きさに削減するための方法の一つだそうです.
といっても,分かりにくそうなので,メトリクスが具体的にどういった情報を指すのかというと,HTTPリクエストを受け付けた回数,リクエストの処理に使った時間,現在処理中のリクエストの数などが挙げられます.この辺りは実際にpro

元記事を表示

vscodeで[packages.Load error: err: exit status 2: stderr: go: no such tool “compile” go: no such tool “compile”]エラー発生したときの対処法

## 詳細
vscodeでgo.modにて以下エラー発生
“`
packages.Load error: err: exit status 2: stderr: go: no such tool “compile” go: no such tool “compile”
“`
![Screen Shot 2022-11-11 at 17.54.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323144/8a340e3b-dd58-2a10-5aba-1d65edf95488.png)

## 結論

### vscodeのsetting.jsonのgopathが間違ってた

ローカルの$GOPATHが
“`bash
$ echo $GOROOT
/usr/local/go
“`

なのに、vscodeのsetting.jsonで指定されたpathが`/usr/local/go/bin`なので事象発生してた

![Screen Shot 2022-11-11 at 18.00.00.png](

元記事を表示

direnvで設定された環境変数はVSCodeで反映されない!?と思っていたら初歩的なミスでした。

ここで参照する本は**Go言語でつくるインタプリタ**(ISBN: 978-4-87311-822-2)、(以下、猿本と言います)。
この本のソースコード群をダウンロードして使用しているので、ディレクトリ構成とかは本に従います。
***
大学の授業で猿本を教科書として使用しています。授業資料に従うがまま環境(`$GOPATH`、`$GOROOT`等の環境変数の設定など)を整え、Ubuntuのターミナル上でプログラムを実行させることはできたのですが、しかし、VSCode上では環境変数の設定が反映されていないようで、
“`text:/01/src/monkey/main.go
could not import monkey/repl (cannot find package “monkey/repl” in any of
/usr/lib/go-1.18/src/monkey/repl (from $GOROOT)
/home/***/go/src/monkey/repl (from $GOPATH))
“`
とエラーが出ます。
どうやら`$GOROOT`と`$GOPATH`か

元記事を表示

GoのWebアプリをAzure App Serviceにデプロイする

# はじめに

2022年11月、実験版ながら再びLinuxでのAzure App ServiceでGoがサポートされました。

– [Go available on App Service – Azure App Service](https://azure.github.io/AppService/2022/10/12/Go-on-AppService.html)

初代(?)は2017年12月にサポート対象外となりました。

– [AzureでWebアプリを稼働させる「App Service」とGo – Qiita](https://qiita.com/qt-luigi/items/1cbcdc9efb2f5b4ec6f8)

今回は、Goのコードがデプロイされて、組み込みイメージを使ってLinuxコンテナーでコンパイル&実行されます。

デプロイ手順が「[app-service-linux-docs/use_go_with_appservice.md at master · Azure/app-service-linux-docs · GitHub](https://githu

元記事を表示

【Go】エラー「go.mod file not found in current directory or any parent directory」が発生した場合の対処法

## 概要
Go 言語でエラーが発生した場合の対処法の備忘録

## 事象
エラー: `go: go.mod file not found in current directory or any parent directory`
? Go 言語を初めて扱う場合によく遭遇するエラー
![go_環境構築_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/2abef0b5-f31a-fdfb-08f3-1f86fbedf779.png)
(単純な Hello World 表示プログラムでのエラー例)

## 原因
`go.mod` ファイルが同階層もしくは親階層に見つからないため。

「go.mod ファイルが無いよ」と怒られているので、このファイルを用意する必要があります。
`go.mod` ファイルは、1つのプロジェクト(今回の事例なら「Hello World を表示するプログラム」という単位)で使用される go プログラム全体を管理するファイルのこと、…というイメージです。

## 対

元記事を表示

【Go】Go言語の環境構築手順とHelloWorld作成(まとめ)

## 概要
Go言語(golang)の環境構築方法、および、簡単な「Hello World」プログラム作成方法の備忘録

## 前提
– 使用PCスペック
– OS: macOS 12.4

– Go バージョン: v1.19
– Go の公式サイトは現在英語しかなさそう

## 手順

### インストーラをダウンロード

公式サイト([go.dev](https://go.dev))にアクセス
![go_環境構築_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/2fd499d7-a8bc-19d0-209d-85d575222e07.jpeg)

トップページの「Download」ボタン、もしくは「Get Started」ページ内のダウンロードボタンを押すと
以下のダウンロードページに行けるので、ここで自分のPCのOSに合ったインストーラを選択してダウンロード
![go_環境構築_02.png](https://qiita-image-store.s3.ap-northeast

元記事を表示

golangとAWS Cognitoで認証機能を実装してみた

# 環境について
## Cognitoへのアクセス準備
Cognitoへ接続するためには
`aws_access_key_id`
`aws_secret_access_key`
がそれぞれ必要なので、[AWS SDK for Go](https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#creating-the-credentials-file)を見て下記のファイルを作成します。
“`text:credentials
[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
“`
それぞれのKeyについてはIAMでCognitoへのアクセス権限を持ったユーザーを作成すると発行される。

上記で用意したDockerfileにコンテナ内へコピーするコマンドを追加
“`docker:Dokerfile
〜略〜
#

元記事を表示

Gormの使い方についてまとめてみた

goを使ってGormを使ってデータベース操作する必要が出てきたのでいろいろ調べた結果をまとめます。

# データベーススキーマの作成

まずはスキーマの作成の仕方についてみていきます。

### Migrate

Migrateは、接続先のスキーマを参照して、テーブルやカラムがなければ自動的に作ってくれるコマンドです。
足りない関連やテーブルを自動で作ったりはしてくれるが、勝手にカラムを消したりすることはしないとのこと。

> **Auto Migration**
>
> Automatically migrate your schema, to keep your schema up to date.
>
> > NOTE: AutoMigrate will create tables, missing foreign keys, constraints, columns and indexes. > > It will change existing column’s type if its size, precision, nullable changed. It WON’

元記事を表示

OTHERカテゴリの最新記事