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

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

Go言語 ゴルーチン

## ゴルーチン
ゴールーチンと呼ばれる、スレッドを用いて並行処理を行う機能。
関数に「go」を付加することで、その関数は並行的に処理される。

## Code
“`Go
// 素数をチェックする関数
func checkPrime(number int) bool {
isPrime := true
if number == 0 || number == 1 {
return false
} else {
for i := 2; i <= number/2; i++ { if number%i == 0 { isPrime = false break } } if isPrime == true { return true } } return false } // 素数を生成する関数 func primeRoutine1() { i := 0 for { i += 1 if checkPrime(i) { fmt.Printf("PrimeRoutine1 ☆ : %d\n", i) } }

元記事を表示

初心者がGoを学ぶときに気になったことメモ

最近のはやりに乗って、GoとBlockchainの両方をこの動画(シリコンバレーエンジニアの酒井潤さんの「現役シリコンバレーエンジニアが教えるGoで始めるスクラッチからのブロックチェーン開発入門」https://www.udemy.com/course/go-blockchain/
)を見て勉強し始め、ここ最近終了したところなのだが、なんせbackendもblockchainもまるで初心者なもので、この動画を通してGOの理解しにくかった部分を自分なりにかみくだいてアウトプットしていこうと思う。僕のようにバックエンド完全初心者の手助けになれば幸いです

# MarshalJsonって何?

MarshalJsonというのは、構造体→JSON形式に変換することらしい。
(逆にUnMarshalJsonというのは、JSON形式→構造体に変換すること)

しかし、この講座をみていると、少し不思議な書き方をしていた。

“`golang:blockchain.go
type Block struct {
timestamp int64
nonce int
prev

元記事を表示

【Go】XORMでOracle Databaseに接続する

## 概要
GolangのO/Rマッパーで、Oracle Databaseへの接続できるものがないか探してみたところ、[XORM](https://xorm.io/)というライブラリに行き着きました。[こちら](https://gobook.io/read/gitea.com/xorm/manual-en-US/)のドキュメントにある通り、Oracleのドライバー対応は2022年4月現在はexperimentの状態ですが、使えなくもないだろうということで少し試してみました。

## 前提
[mattn/go-oci8](https://github.com/mattn/go-oci8)のセッティングを事前に行なってください。[【Oracle】Mac環境でmattn/go-oci8のライブラリをインストール時「oci.h: No such file or directory」が発生](https://qiita.com/someone7140/items/47bc754040374e2c5c8f)の記事も、参考になるかと思います。

## 実装サンプル(接続部分)
DBの接続部分(エンジ

元記事を表示

GithubActionsとAWS App Runnerで自動デプロイしてみた

## はじめに
最近参加したwebinerにて、AWS App Runnerというものを知ったため触ってみました。

https://aws.amazon.com/jp/apprunner/

簡潔にいうと、
>コンテナ化されたウェブアプリケーションや API を開発者が簡単かつ迅速にデプロイできるフルマネージド型サービスです

とのことです。
GitHubのソースコードをApp Runner上でビルド&デプロイ、またはECRのビルド済みコンテナイメージがデプロイできます。

webinerではGitHubのソースコードからデプロイを行うデモをしており、同じような手順で試したところ、確かにあっさりとサービスが立ち上がりました。
記事にするほどでもないくらいサクッとできてしまったため、折角なので今回はECRのイメージからのデプロイをやってみました。
また、前々からGithubActionsを触ってみたいと思っており、うまく連携させられるみたいだったため取り入れてみます。

## GitHub Actionsとは
https://docs.github.com/ja/actions/lea

元記事を表示

Go言語 マップ

## マップ
連想配列に類するデータ構造。
任意のキーと、任意の値を保持することが出来る。

## Code
“`Go
func main() {
// マップの生成
abcMap := make(map[int]string)
fmt.Println(abcMap)

// 値の代入
abcMap[1] = “A”
abcMap[2] = “B”
abcMap[3] = “C”
fmt.Println(abcMap)

// リテラルを用いた生成
abcdeMap := map[int]string{1:”A”, 2:”B”, 3:”C”, 4:”D”, 5:”E”}
fmt.Println(abcdeMap)

// 要素の参照
fmt.Println(abcdeMap[1])
fmt.Println(abcdeMap[5])

// 要素数
fmt.Println(len(abcMap))

// 要素の削除
delete(abcMap, 2)
fmt.Println(abcMap)

// forによる出力
for i, m := r

元記事を表示

Go言語 スライス

## スライス
可変長配列を表す型。
配列と違い、スライスは要素の追加が出来る。

## Code
“`Go
func main() {
// スライスの生成
tenSlice := make([]int, 10)
fmt.Println(tenSlice)

// 要素への代入
tenSlice[0] = 123
tenSlice[3] = 456
tenSlice[6] = 789
fmt.Println(tenSlice)

// 値の参照
fmt.Println(tenSlice[0])
fmt.Println(tenSlice[1])

// スライスの要素数
fmt.Println(len(tenSlice))

// スライスの容量
fmt.Println(cap(tenSlice))

// 簡易スライス式
fiveSlice := tenSlice[2:7]
fmt.Println(fiveSlice)

// 要素の拡張
elevenSlice := append(tenSlice, 101112)
fmt.Println

元記事を表示

[API Gateway→ Lambda] Lambdaでクライアント情報を取得してみました

場合によっては、Lambda Functionsでクライアント情報を取得する必要があります。
たとえば、クライアントのIPアドレスを確認します。

API Gateway(Lambda Proxy)→ Lambda Functions(Golang)を構築してみました。
Lambdaで、APIGatewayを呼び出したクライアントの情報を取得しました。

Golangのサンプルコード:
“`
package main

import (
“context”
“fmt”
“github.com/aws/aws-lambda-go/events”
“github.com/aws/aws-lambda-go/lambda”
)

func handleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
strInfo1 := request.RequestContext.Identit

元記事を表示

Go+CodeCommitで任意の名称のライブラリを作成・利用する方法

# 目的
Goでモジュールを作成する際には`go mod init`で任意の名称を指定することができます。
しかし AWS CodeCommit を利用時にはCodeCommitのホスト名(`git-codecommit.${AWS_REGION}.amazonaws.com`)を使用する必要があります。
そこでCodeCommitを利用しつつ任意の名称でGoのライブラリを作成する方法を調査したのでそのやり方をまとめます。
# 経緯
こんな感じです。
– プロジェクトではCodeCommitを使わないといけない
– ~~モジュール名にCodeCommitのホスト名が含まれると、別リージョンにリストアした際にクライアント側からアクセスが出来なくなる~~
– 所感にも記載しましたが、Gitのホスト名を置換する機能を使うと解決です
– モジュール名にCodeCommitのホスト名が含まれることに気持ち悪さを感じている
– Goでライブラリを作成しないといけなくなった!!!

絶対に達成しないといけないわけではなく完全に好みですね。
# やり方
今回実現するのに、Gitのホスト名を置換

元記事を表示

【Golang】ポインタと実体の使いどころ

Golangにおけるポインタの使いどころ、実体の使いどころを整理しました。

# 結論

| | イミュータブル変数 | 関数引数/メソッドレシーバ | ゼロNULL区別 |
|:-:|:-:|:-:|:-:|
| ポインタ | × | ◎ | ○ |
| 実体 | ○ | ○ | × |

# 1. イミュータブル変数は「実体」で宣言する。
ポインタは、別変数に値を渡すと、その変数からも元値の更新が可能となる。
つまり、複数の変数間で1つの値を共有する**ミュータブルな**変数を意味する。

“`go
package main

import “fmt”

func main() {
v1 := &S{Number: 1} // ポインタで宣言
v2 := v1 // 別変数に値を渡す
v2.Number = 10 // 別変数を更新
fmt.Printf(“v1: %v, v2: %v”, v1, v2)
// -> v1: &{10}, v2: &{10}
// v1の値も更新されてしまう: ミュータブル変数
}

ty

元記事を表示

東京ドームのイベント情報をSlackに通知させてみた

# はじめに
私が通っている大学のすぐ近くには東京ドームがあり,コロナ禍に入る前はライブ帰りの客で駅や電車がやたら混むということがよくありました.
今年に入ってからイベントが再開されてきていることもあり,またこういったことが起こる気がしたので,予めイベント情報を知れる仕組みを作りたいと思いました.

# 使用した技術
* Go
* goquery
* Serverless Framework
* AWS Lambda
* Github Actions

# プロジェクトの作成
予め作成したディレクトリに移動した上で,以下を実行します.
“`
$ sls create -t aws-go-mod
“`
そうすると,最低限動くServerless Frameworkのプロジェクトが作成されます.
もしServerless Frameworkをインストールしていない場合は,以下のコマンドでインストールしましょう.(Node.jsが必要)
“`
$ npm i -g serverless
“`
or
“`
$ yarn add global serverless
“`

# 実装

元記事を表示

Go言語で平均を出すコード

“`go:Goで平均を出すだけのコード
package main

import “fmt”

func avg(num []int) int {
goukei := 0
count := 0
for {
goukei = goukei + num[count]
if count == len(num)-1 {
return goukei / count
}
count ++
}
}

func main() {
keisan := []int{34,56,23}//ここに値
x := avg(keisan)
fmt.Println(“平均:”,x)
}
“`

元記事を表示

Goのコンパイラバージョンアップ手順

`Go`のコンパイラをバージョンアップする際の変更点やコマンドのメモです

# バージョンアップ
## `go.mod`ファイル

`go.mod`でmodule管理している場合は`go mod edit`コマンドで`go.mod`ファイルでの`Go`のバージョンを変更します。

以下のように`1.17`が指定されていたとして`1.18`に更新する場合は、
“`go:go.mod
module sample-app

go 1.17
“`

次のコマンドを実行します。

“`bash
$ go mod edit -go=1.18
“`

再び`go.mod`ファイルを確認すると`1.18`になっていることが確認できます

“`go:go.mod
module sample-app

go 1.18
“`

## `Dockerfile`

`Dockerfile`は手で書き換えます。

https://hub.docker.com/_/golang

“`diff:Dockerfile
– FROM golang:1.17.8-buster
+ FROM golang:1

元記事を表示

GO1.18のGenericsを用いてmap,flatMap,filterなどのコレクションライブラリを作ってみる

# はじめに
ついにgo1.18でgenericsが使用できるようになりました.
go.1.17で導入される予定でしたが延期されたので待望のアップデートです.
[go1.18 release notes](https://tip.golang.org/doc/go1.18)

これによってScalaやKotlin, ypescriptのように, map/reduce/filterなどのコレクション関数が使用できるかもしれません.
早速試してみましょう.

また本記事で紹介しているコレクション関数は以下に公開しております.
[go-collections](https://github.com/koh789/go-collections)

# コレクション関数例
## Map

ある型Tのsliceを受け取って,異なる型Vを返却するmap関数です.

“`go:
func Map[T, V any](elms []T, fn func(T) V) []V {
outputs := make([]V, len(elms), cap(elms))
for i, elm := ra

元記事を表示

元組み込みC++エンジニアがWebアプリを作ってみる – とりあえず動かしてみる

※親ページは[コチラ](https://qiita.com/dashi-no-ajiwai/items/c1e776a17e0c1e6af40b)

# やること
とりあえず、バックエンドのルーターを作って動かしてみます。
ブラウザでURL(今はローカルなので`localhost`)を指定して、データが取得できることを確認します。

# 下準備
だいたいターミナル操作です。
## ディレクトリ構成
“`
$ cd ~
$ # 作成するアプリのもろもろを配置するディレクトリ
$ mkdir first_app && cd first_app
$ # ページのルーターを配置するディレクトリ
$ mkdir first_app_router && cd first_app_router
“`
## インストール
– [Go](https://go.dev/)
Macなら[Homebrew](https://brew.sh/index_ja)が入っていれば楽ですね。
現時点で`1.18`が最新です。
“`
$ brew install go
$ go version
go version

元記事を表示

Go1.18でジェネリクスが追加されたので、5年ぶりにGolangを覚えなおし、GenericListとマルチキャスト可能Channelの実装をした

# はじめに
Go1.18が2022/3/15にリリースされました
以前Goの開発陣はジェネリクスは不要とか言ってたような気がするが
1.17でもお試しが出来たと思いますが
今回正式に導入されたので、5年ぶりにGoのお勉強です

ジェネリクス以外に5年間のUpdateを調べましたがツールやライブラリは変わったものの
言語じたいはたいした変化はなかったので
ジェネリクスだけです

# ジェネリクスとは
C++でいうテンプレートです
D言語、Java、C#、Haskell・・・
今では様々な言語に導入されている概念です
引数の型が異なる関数やメソッド、メンバ、クラスに対して、一つの実装で複数の型に対応出来ます

具体的には、例えばint型の入るリストクラス IntListを作ったとします
float型のリストも必要となったのでコピペして FloatListクラスを作成
string型のリストも欲しいから StringListクラスを作成
自作したMyClassを保存する MyClassListを作成・・・
メンテできませんね。。

ジェネリクス例
List というクラ

元記事を表示

【Oracle】Mac環境でmattn/go-oci8のライブラリをインストール時「oci.h: No such file or directory」が発生

## 概要
GolangでOracleに接続する際に、[mattn/go-oci8](https://github.com/mattn/go-oci8)のライブラリを使うことになると思います。ライブラリのGitHubのページにある手順に従ってMacにインストールしようとしたのですが、go getの実行時に`oci.h: No such file or directory`が発生しました。
今回はこのエラーについて、対応した内容をメモ書きします。

## 原因
原因はエラーにある通りの内容で、`oci.h`というファイルが無いからになります。
まず前提として、このライブラリを使う前にOracleのInstant Clientを用意する必要があります。基本的には`mattn/go-oci8`のGitHubのページにある手順の通り、ダウンロードした後に、設定ファイルの作成とパスを通せば良いです。ただ、このInstant Clientでにて、接続時に使用する`oci.h`が含まれてませんでした。

## 対応
Macに限った話ではないのですが、 Instant Clientでは`Basic P

元記事を表示

Go 1.18 を触ってみた(Generics, Fuzzing, Workspaces)

# 初めに
Go 1.18がリリースされたので触ってみました。
今回の重要なリリースは下記の The Go Blog に掲載しているものだと思ったので、ここに書いてあるものを触ってみました。

https://go.dev/blog/go1.18

# 主な改善点
上記のページを見ると、今回のバージョンアップで特に注目すべきものは以下になります。

– Generics
– Fuzzing
– Workspaces
– 20% Performance Improvements

それぞれコードを交えながら、触ってみた感想と解説をしていこうと思います。

# Generics

日本語だと「ジェネリクス」と読みます。Javaを触ったことある人にとっては知ってて当たり前のものではないでしょうか。
Generics とは、1つのソースコードで様々なデータ型の処理をできるようにするものです。

The Go Blog には、最も頻繁にリクエストされていた機能だと書いてあります。つまりこの機能は多くの人が待ち望んでいた機能だと言えます。

親切にチュートリアルまで用意してくれています。今回はこ

元記事を表示

nil かもしれないメンバのある構造体の整列

# これは何?

https://qiita.com/sachiko-kame/items/e1315bff25e2abdb8639

という記事を見て、自分ならどう書くかなと思って書いたもの。
generics の練習を兼ねて

# まずはソース

“`go:go1.18
package main

import (
“encoding/json”
“fmt”
“math/rand”
“sort”

“golang.org/x/exp/constraints”
)

type Sample struct {
Name *string
Description *string
Note *string
}

func ToPtr[T any](x T) *T {
return &x
}

func NewSample(name, desc, note *string) *Sample {
return &Sample{
Name: name,
Description: desc,
Note: not

元記事を表示

XMLをスライスにUnmarshalするときの罠

スライスを `Marshal` して `Unmarshal` すると、**先頭要素しか取得できません**!

“`go:スライスをもとに戻せない?
package main

import (
“encoding/xml”
“fmt”
)

func main() {
nums := []int{1, 2, 3}
b, _ := xml.Marshal(nums)

var copiedNums []int
_ = xml.Unmarshal(b, &copiedNums)
// 先頭要素しか取れない!
fmt.Printf(“%#v\n”, copiedNums) // []int{1}
}
“`

JSONのように `Marshal` と `Unmarshal` を逆変換として使うことは**できません**。XMLをオブジェクトのシリアライズに使っている場合は注意が必要です。

# バージョン

Go 1.18

# Why?

スライスをmarshalすると各要素が並んだ形式で出力されます。

“`
[]int{1, 2, 3} → “1

元記事を表示

Go言語 HelloWorld

## Code
“`Go
package main

import “fmt”

func main() {
fmt.Println(“Hello, World!”);
}
“`
## Comment
Go言語は、「go run」コマンドによって、ビルドプロセスを隠蔽出来る。
もちろん、「go build」コマンドによって、明示的にビルドすることも出来る。

## Output Sample
$ go run hello.go
Hello, World!
$ go build -o hello hello.go
$ ./hello
Hello, World!

## GitHub
https://github.com/GL-Kageyama/Go_HelloWorld

元記事を表示

OTHERカテゴリの最新記事