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

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

Go 1.19 で os/exec パッケージの挙動が変わった話【転載版】

([Go強化月間](https://qiita.com/official-events/ae80b010f51f7018891a)と聞いたので(笑) この記事は[自ブログ](https://text.baldanders.info/golang/exec-package-in-go119/)からの転載です。書き捨てなのでメンテナンスしません。悪しからずご了承の程を)

[Go] 1.19 の[リリースノート](https://go.dev/doc/go1.19 “Go 1.19 Release Notes – The Go Programming Language”)を眺めてみると

> [`Command`](https://go.dev/pkg/os/exec/#Command) and [`LookPath`](https://go.dev/pkg/os/exec/#LookPath) no longer allow results from a PATH search to be found relative to the current directory. This re

元記事を表示

Goの構造体に関してのアウトプット

## 初めに
Goの構造体を勉強したため、アウトプットのため記事を投稿する。

■ 実行環境
[The Go Playground](https://go.dev/play/)
■ GOのバージョン
1.18

## 概要
構造体とは・・・異なるデータ型を1つにしたもの
1つ1つのデータをフィールド呼ぶ。

## 構造体の宣言

##### 基本形

“`go
type [構造体名] struct {
[フィールド名] [型]
}
“`

##### 例

“`go
type Go struct {
X int
Y int
S string
}
“`

フィールドの型が同じ場合は、カンマを使用して同じ列に記載可能である。

“`go
type Go struct {
X, Y int
S, T string
}
“`

※構造体名の頭文字は小文字でも宣言できるが、その場合は外部のパッケージから参照することができないので、使用用途に合わせて変更する必要がある。
余談だが、Go言語の予約後に「go」という単語があるので、上記例にて頭文字を小文字で使用するとエラーにな

元記事を表示

Go で Stack と FIFO

# はじめに

[Go 強化月間](https://qiita.com/official-events/ae80b010f51f7018891a) と聞いたので Go の記事を書きます。

Go で Stack や FIFO を実装する時には `container/list` を使います。この `container/list` は Stack と FIFO に必要となるベースのみ提供されます。なぜなら Stack も FIFO も仕組みは同じで、取り出す時に先頭か最後かの違いしかないからです。

# Stack

`container/list` をフィールドに持ち、末端に追加、末端から取り出すのが Stack ですね。

“`go
package main

import (
“container/list”
“fmt”
)

type Stack struct {
v *list.List
}

func NewStack() *Stack {
return &Stack{v: list.New()}
}

func (s *Stack) Push(v interfac

元記事を表示

gRPCでチャットを実装する(Go / React)

# 概要

前回の記事 → [なるべく詳しく調べるgRPC入門?‍?](https://qiita.com/kawamou/items/49176fa4035d485065c1)

gRPCについて学びましたが、何かしら手を動かしてアウトプットしたい気持ちになってきました。
諸々調べると、[gRPCのストリーミングな仕組みを活かしてチャットを作っている方](https://qiita.com/okmttdhr/items/a37563047904ac98f3ed)が何人かいらっしゃったので、自分も作ることにしました?‍?

実装にあたり、下記の技術を選定しました。

“`
フロントエンド – React(TypeScript)
バックエンド – Go
プロキシ – Envoy
“`

ブラウザ上で動くReactとgRPCサーバ(Go)がやりとりすることでチャットを構成します。
ブラウザから直接gRPCを喋ることはできないので、gRPC-Webの仕組みに乗ってEnvoyプロキシ越しにバックエンドと通信します。

# 成果物
実装したチャットのgifはコチラです。

![chat2x.

元記事を表示

【#51 エンジニア転職学習】goqueryを使用したスクレイピング

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

本日よりスクレイピングのプロジェクトをつくっていきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。

https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
本日はプロジェクトのタスク決め、goqueryの操作をやってみました。
* **プロジェクトのタスク決め ←Topics!!**

# スクレイピングプロジェクトのタスク決め
今回参考にするメイン教材は以下の動画です。
動画はLaravelとgoutteを使用していますが、**Go・goquery・GORM**に置き換えて作成していきたいと思います。

### タスク

元記事を表示

Golangでphpのarray_diff_assocをやる方法

## 下記の関数にarray_diff_assocしたいマップを渡せばOK!!
“`golang
//php array_diff_assoc replacement
func ArrayDiffAssoc(s1, s2 map[string]interface{}) map[string]interface{} {
r := make(map[string]interface{})
for k, v := range s1 {
if c, ok := s2[k]; !ok || c != v {
r[k] = v
}
}
return r
}
“`

以上

元記事を表示

Goでスクレイピング

# はじめに
Dockerの環境構築からGo言語でスクレイピングする手順を整理しました。

# Go言語について
https://go.dev/

– Googleで開発されたプログラミング言語
– 文法がシンプルで大人数開発に向いている
– 処理速度が早い
– 並行処理が得意

# 本編
## ディレクトリ構成
ディレクトリ構成は下記のようになります。
“`
.
├── cmd
│ └── main.go
│ └── colly.go
│ └── dohouse_news.go
│ └── go.mod
│ └── go.sum
├── docker-compose.yml
├── Dockerfile.yml
“`

# Docker
Goを実行する環境をDockerで構築していきます。
### Dockerfile
“`dockerfile:Dockerfile
# image取得
FROM golang:1.19.0-alpine3.16

# ホストのファイルをコンテナの作業ディレクトリにコピー
COPY . /go/src/app

# ワーキングディレクトリの設定

元記事を表示

【Golang】SQLite3 でテーブル名一覧と DB の総レコード数を取得する

> Go 言語(以下 Golang)の [database/sql 標準パッケージ](https://pkg.go.dev/database/sql)で SQLite3 で DB を作成したものの、動的に作成されたテーブルのため、**作成されたテーブル名の一覧を取得する必要がある**。しかも、何件登録されているか、**DB 内の総レコード数を後からでも確認する方法**がないものか。
>
> Go 1.18 以降、[ドライバーは、もちろん天下の mattn さんの “go-sqlite3″](https://github.com/mattn/go-sqlite3)。

[「”golang” “sqlite3” テーブル名 一覧 取得」でググって](https://www.google.com/search?q=%22golang%22+%22sqlite3%22+%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E5%90%8D+%E4%B8%80%E8%A6%A7+%E5%8F%96%E5%BE%97)も、SQLite コマンドの `.table` で確認する方

元記事を表示

GoのAPIGatewayでslackのslashコマンド発行時にリクエストを検証するサンプル

## 説明
– Bodyの中の`token`を使うこともできるが、非推奨とされている
– HMACを利用して自身のSlackから送信していることを検証できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/59702e7c-a77b-3dc2-5a1f-8ce7feb8f40e.png)

## イメージ
1. `v0::`の文字列に対して、`Signin Secret`で復号する
1. 1の値を`X-Slack-Signature`を比較して一致しなければ、リクエストから落とす

## サンプル

“`go
func CheckSlackSignature(request events.APIGatewayProxyRequest) error {
slackVersion := “v0:”
slackTimestamp := request.Headers[“X-Slack-Request-T

元記事を表示

GitHub ActionsでSecretsから取得した情報をgo:embedで読み込む

# go:embedを使用したファイルの埋め込み

Go言語で外部ファイルを読み込むとき、go:embedディレクティブを使うと実行バイナリにファイルを埋め込むことができます。
変数の前に“`//go:embed ファイル名“`のように書きます。

## コード
“`go:main.go
package main

import (
_ “embed”
“fmt”
)

//go:embed secret.pem
var secretKey []byte

func main() {
fmt.Printf(“埋め込んだファイルの中身\n%s\n”, secretKey)
}
“`

“`secret.pem
—–BEGIN PRIVATE KEY—–
FOOBAR0123456789foobar0123456789FOOBAR0123456789foobar0123456789
FOOBAR0123456789foobar0123456789FOOBAR0123456789foobar0123456789
—–END PRIVATE KEY—–

元記事を表示

【#50 エンジニア転職学習】WSL2でUbuntu20.04のGo開発環境をつくる

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

3回連続になりますが、Linuxの開発環境を整えようと思います。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。

https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
* **WSL2を使用してUbuntu20.04の開発環境構築 ←Topics!!**

# WSL2を使用してUbuntu20.04の開発環境構築
先日の投稿でVirtualBox上にUbuntu22.04を導入しました。
https://qiita.com/Chika110/items/9bc531bc3ed83784eae3

問題なく動いているように感じたのですが、全く負荷のかかる作業をしていない状態でも、
**ゲスト・ホストどちらともYouTube等の再生ができませんでした。
他にもBluetooth機器の接続がおかしくなるといった不具合も**でました

元記事を表示

ginの基本

# はじめに

goのWebアプリケーションフレームワークを触りながらメモしてみた。網羅的に学びたい場合は公式の[ドキュメント](https://github.com/gin-gonic/gin#gin-web-framework)をみた方が良いと思います。

# 準備

goをインストールする。windowsやmacだったら[公式サイト](https://go.dev/)からインストーラをダウンロードして実行、インストーラの指示に従っていけば特に迷うことなくセットアップできるはず。

エディタは[Visual Studio Code](https://code.visualstudio.com/)がオススメだけれど、好みに応じて選択すれば良いのではないかと思う。

続いて、開発用のフォルダを準備する。まず適当にフォルダを準備する。

“`bash
mkdir GinStudy
“`

そして初期化。

“`bash
cd GinStudy
go mod init GinStudy
“`

以降、全てこのフォルダ配下で作業する。

# とりあえず空っぽのサーバ

公式の[q

元記事を表示

Goのcryptoで暗号化(AES-GCM)された文字列をPHPで復号した

Goのaesパッケージ(crypto/aes)で暗号化された文字列を、PHPで復号したときのことを備忘録がてらまとめます。

# 前提
– Go 1.13
– PHP 8.0
– AES-256-GCM
PHP歴は1年超、Goは書けないけどなんとなく読める。
今回の平文は、仕様上すべてが短い英単語である。

# GoのAES-GCMの仕様
認証タグ(tag)が暗号化後のバイナリに連結される。
“`
[暗号][tag(16Byte)]
“`
ivとtagの長さは次のコードの153行目あたりで定義されている。
https://go.dev/src/crypto/cipher/gcm.go
“`
const (
gcmBlockSize = 16
gcmTagSize = 16
gcmMinimumTagSize = 12 // NIST SP 800-38D recommends tags with 12 or more bytes.
gcmStandardNonceSize = 12
)
“`

つまり、末尾16Byteをtagと

元記事を表示

[Go]ジェネリクス

# 概要
**同じコードで様々な型のデータを処理できるようにする** 機能。
動的型付け言語っぽく処理させることができる。
goではバージョン1.18から追加された。

関数の引数、返り値ともにその型を「型パラメータ」 + 「型パラメータリスト」で定義できる

**参考**

https://zenn.dev/nobishii/articles/type_param_intro

# 引数の型を「型パラメータ + 型パラメータリスト」で定義

**一般化したコード**
“`generaralized_argument_generics_sample.go

// [<型パラメータ名> <型パラメータの制約>]の部分が「型パラメータリスト」と呼ばれる部分
func <関数名>[<型パラメータ名> <型パラメータの制約>](<引数名> <型パラメータ名>) {
<処理>
}
“`

**具体的にジェネリクスを適用したサンプルコード**

“`argument_generics_sample.go
package main

import “fmt”

/*
* [概要] 引

元記事を表示

webhookを叩くだけのシンプルなLambdaを5つの言語で作ってみて実行速度を測る

我が社にて、cloud watchのalertを拾って、LambdaからIFTTTのwebhookに繋げてパトライトを光らせよう、っていうプチプロジェクトが走ろうとしております。

![スクリーンショット 2022-08-13 13.20.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308709/96ae713e-868f-6a59-91ff-2bfbd6bbf46c.png)

だいたいこちらの記事のような内容です。
https://kimama.cloud/2020/01/06/alarm2patlite/

ただ、今回はこのへんの事情は関係なく・・・

![スクリーンショット 2022-08-13 13.22.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308709/33dc51b1-853e-9f45-be5d-ef884f48dadc.png)

↑ここだけの記事です。Lambdaのみ。

##

元記事を表示

Docker Engine SDK でホストポートを範囲指定する

Docker Engine SDK でホストポートを範囲指定する
コードは Go 言語ですが、他の SDK でも困っていたら、試してみるとうまくいくかもしれません。

検索しても、いまいち解決していなさそう
https://stackoverflow.com/questions/63236679/unable-to-port-forward-with-the-port-range-syntax-in-docker-sdk

### `”80-85:80″`(ホストポートを範囲指定する場合)
Dockerfile で `EXPOSE` していても `ExposedPorts` が必要な模様
https://qiita.com/ryskiwt/items/27cb74f621c9e9ee18be#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E4%BD%9C%E6%88%90

起動途中や停止中に Docker Desktop 等で確認すると `localhost:80-85` と表記されるが、起動が完了すると正しく `0.0.0.0:80` や `0.0.0.

元記事を表示

Golangを使用したMySQLで設定したデータ型の注意点

## 概要

今回はMySQLを使用して、作成したテーブルのカラムのデータ型で`time.Time`型を指定した際の注意点を共有します。

## 前提

ディレクトリ構造

“`
.
├── models
│ ├── base.go
│ └── users.go
├── docker-compose.yml
├── Dockerfile
├── go.mod
├── go.sum
└── main.go
“`

今回はDockerを使用して環境構築をしています。

“`Dockerfile
FROM golang:1.19.0-alpine3.16
WORKDIR /app
COPY . .
“`

“`docker-compose.yml
version: ‘3.9’
services:
db:
image: mysql:8.0
container_name: mysql
env_file: .env
ports:
– 3306:3306
environment:
MYSQL_ROOT_PASSWO

元記事を表示

【Go】ビットを利用したフラグ管理

## 概要
Goでビット演算を利用したフラグ管理を行う実装を記述します。
複数指定可能なオプションを、constで定義している際などに使える便利な小技です。
Go以外でも、ビット演算を利用したオプション管理を実装している方は割と少なくないと思いますが、私自身これまでにビット演算を実装で使ったことがなく、「これは便利だわ〜」と感じたので、勉強ログ的なテンションで記述していきます。

## ビット演算子
|演算子|説明|
| :—: | :—: |
|x | y|x と y の ビット論理和|
| x ^ y |x と y のビット排他的論理和|
| x & y |x と y のビット論理積|
| x << n |x の n ビット左シフト| | x >> n |x と n ビット右シフト|

## 実装
“`Go
type AmazonPrimeOpt uint64

const (
Video AmazonPrimeOpt = 1 << iota Music Photos Reading Gaming ) ``

元記事を表示

GolangでCloudFrontのAliaseドメインを更新するサンプル

## メモ
– 実際にCloudFrontの構成情報を更新するためには、指定したい部分を更新するというよりかは、構成情報をすべて送るイメージで実装する
– そのため、一度構成情報を落としてきて、それに対し変更を加えて、それをPUSHするというような流れを組む必要がある
– ETagとよばれるトランザクション管理するような値があり、更新系メソッドには必要
– 参照系メソッドを呼んだときに一緒に返却される

## サンプル

“`go
package main

import (
“fmt”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/awserr”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/cloudfront”
)

func main() {
id := “XXXXXXXXXXXXX”
sub_domain := “test02”
hosted_zone_name :

元記事を表示

Dockerを使用してGoでMySQLに接続しようと思ったら詰まった話

## 概要

現在**Golang**を学習しています。その中で**MySQL**との接続に詰まってしまったのでその解決方法を共有したいと思います。

## 前提

私は基本的に学習するときはローカルの環境を汚したくないので**Docker**を使用しています。
なので今回もDockerを使用して行います。
なお今回は、Dockerの構成を最低限しか設定しません。

### Dockerfile構成

“`dockerfile
FROM golang:1.19.0-alpine3.16
WORKDIR /app
COPY . .
“`

### docker-compose.yml構成

“`docker-compose.yml
version: ‘3.9’
services:
db:
image: mysql:8.0
container_name: mysql
env_file: .env
ports:
– 3306:3306
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_

元記事を表示

OTHERカテゴリの最新記事