- 1. [Go] 構造体の変換と比較
- 2. DockerでGoのAPIサーバーを立てる
- 3. Go言語を始めたい方へ ~ Hello World から ゴルーチン まで ~
- 4. Oracleを使うGoアプリのコンテナ化メモ(最終回)
- 5. Oracleを使うGoアプリのコンテナ化メモ(挫折編)
- 6. Raspberry pi で BME280 を使用する (Golang)
- 7. Go言語 : キュー(Queue)
- 8. 【Golang】数値をコンマ区切りで出力する【1000桁単位のカンマ区切りフォーマット出力】
- 9. 【Golang】文字間の複数ホワイトスペースを削除して1つのスペースに置き換える関数
- 10. プログラミング言語Go アウトプット(4章)
- 11. Go強化月間~開発する上で知っておくべき知見を共有しよう~ 結果発表?
- 12. Go Moduleって何
- 13. Goで2つのスライスから共通要素を取得したいときはgolang-setをつかおう
- 14. Ory Kratosをセルフデプロイ&SSO設定(GitHub)
- 15. PostGISベクトルタイルサーバーの比較: tegola/martin/pg_tileserv
- 16. 【Go】Templateで二次配列の要素を指定する
- 17. Go言語 : インターフェース(&循環参照の分離)
- 18. 曖昧にしないためのDockerコンテナ内のディレクトリ構造(抜粋)について(Golang/PostgreSQL編)
- 19. GO言語で、確保した配列に、Mapデータからデータ入力する方法
- 20. 【Go言語】Windows10環境でLinux用の実行ファイルを作成する
[Go] 構造体の変換と比較
Goの構造体間で変換できる条件と比較できる条件について書きます。
## 構造体の変換について
Goの構造体の変換はフィールドの名・型・順番・数が一致していることが前提で変換することができます。例えば以下の様に, AとBでは構造体間の変換が可能です。
“`go
package mainimport “fmt”
type A struct {
aa int
bb int
}type B struct {
aa int
bb int
}func main() {
a := A{
aa: 1,
bb: 2,
}
var b B
b = B(a) // 変換可能
fmt.Println(b) //=> {1 2}
}
“`逆に以下の様に、フィールド名が異なる・フィールドの型が異なる・フィールドの順番が異なる・フィールドの数が異なる、等の状態だと変換することができないです。
“`go
package maintype A struct {
aa int
bb int
}type DifferentFieldName struct
DockerでGoのAPIサーバーを立てる
# はじめに
DockerでGoのAPIサーバーを立てるDockerFileを作成しました。
調べたこと、DockerFileについて調べたことをまとめます。[入門Docker 学習メモ](https://qiita.com/bear05/items/302de545018948b5c9c7)
後の実践# 基礎知識の補足
### ビルドコンテキスト(build context)
>docker buildコマンドを実行したときの、カレントなワーキングディレクトリのこと[Dockerfile 記述のベストプラクティス](https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-images/dockerfile_best-practices/)
### Dockerデーモン
Docker Engineの一部。
Docker EngineはDocker CLI、Docker Engine API、 Dockerデーモンで構成されている。
イメージのビルドやコンテナの起動を行ってくれるもの。
> Doc
Go言語を始めたい方へ ~ Hello World から ゴルーチン まで ~
![gopher_fiveyears.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2173896/d6a4258e-a9cb-91f2-b29d-04617034515b.jpeg)
## 概要
本記事は、Go言語を始めたい方に対して、Go言語開発者として抑えておきたい『 1〜10 +α 』をまとめたものである。
初心者はもちろん、中級者の方の基本振り返り用としても活用して頂けることを期待している。## How to Go言語
### HelloWorld
https://qiita.com/GL-Kageyama/items/8b012d078e484100ec85### スライス
https://qiita.com/GL-Kageyama/items/46cd77f71ef6b03e7816### マップ
https://qiita.com/GL-Kageyama/items/f753e3b807d1894e88a4### 構造体
https://qiita.com/GL-Kag
Oracleを使うGoアプリのコンテナ化メモ(最終回)
https://qiita.com/yuuman/items/9f988a9cf4b6dcf4a969
続きます
# 6. mattn/go-oci8 ⇒ sijms/go-ora への変更
結局`mattn/go-oci8`がOracle提供のOracle Instant Clientに依存していることがすべの原因なので、`mattn/go-oci8`からOracle Instant Clientに依存していないGoのみで実装した`sijms/go-ora`に変更することにします。https://github.com/sijms/go-ora
書き直したコードは下記となります。
“`main.go
package mainimport (
“database/sql”
“log”_ “github.com/sijms/go-ora/v2”
)var (
VERSION = “default”
REVISION = “dev”
)func main() {
log.Printf(“Version:%s, Revision:%s”, VER
Oracleを使うGoアプリのコンテナ化メモ(挫折編)
https://qiita.com/yuuman/items/09f6d3e43e96de0a5096
続きます。
# 4. アプリのDockerイメージ化
前回作成したサンプルのGoアプリをコンテナ化して実行できることを確認します。## 4.1 Dockerfileの準備
まずはアプリビルド用のDockerfileをベースイメージ`golang:1.18.5`で作成します。“`dockerfile:Dockerfile
FROM golang:1.18.5WORKDIR /workspace
ENV ORACLE_URL=https://download.oracle.com/otn_software/linux/instantclient/217000/
ENV BASIC_ZIP=instantclient-basic-linux.x64-21.7.0.0.0dbru.zip
ENV SDK_ZIP=instantclient-sdk-linux.x64-21.7.0.0.0dbru.zipENV PKG_CONFIG_PATH=/usr/lib/pkg
Raspberry pi で BME280 を使用する (Golang)
# はじめに
Raspberry pi にて、
温度、湿度、気圧を測定できる環境を構築することを目的とする。
BME280の基本部分のみを使用する。追記:2022/10/10
Appソースの一部を修正# 使用機材
raspi : raspberry pi 4 (4GB)
sensor : bme280 (GYBMEP)“`
$ cat /etc/debian_version
> 10.13$ go version
> go version go1.11.6 linux/arm
“`# i2c 準備
i2c 系ライブラリのインストール
“`
sudo apt install i2c-tools
“`raspberry pi 側の i2c の Enabe
“`
sudo raspi-config
“`
3 Interface Option
P5 I2C
Yes
OK
Finish
の順再起動(不要かも)
“`
sudo reboot
“`
# i2c 確認
“`
sudo i2cdetect -l
>i2c-1 i2c bcm2835 (i2c
Go言語 : キュー(Queue)
## キュー(Queue)
キューとは、入ってきたデータを順番に格納し、先に格納したデータから順に取り出すデータ構造。
先入れ先出し(FIFO:First-In First-Out)方式のデータ構造とも呼ばれる。## ライブラリ
今回使用したライブラリは、 “go-datastructures”.
https://github.com/Workiva/go-datastructures“go-datastructures”ライブラリのキューには、複数の型の値が入れられる。
インストール用コマンド
$ go get -u github.com/Workiva/go-datastructures/…## コード
“`Go
package mainimport (
“fmt”
“strconv”“github.com/Workiva/go-datastructures/queue”
)func main() {
// キューの作成
var queueObj queue.Queue
// 現在のキューの値 : []// キューへ値の追加
q
【Golang】数値をコンマ区切りで出力する【1000桁単位のカンマ区切りフォーマット出力】
> Go 言語(以下 Golang)で `int(1000)` —> `”1,000″` と[コンマ](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9E)区切りでフォーマット出力したい。
>
> しかし、`fmt` パッケージには専用の関数がなさげ。どうしよう。**独自実装やサードパーティのパッケージを使わずに、golang.org 管轄下のパッケージでフォーマットできないものか**。
[「golang コンマ区切り カンマ区切り 出力 フォーマット」でググる](https://www.google.com/search?q=golang+%E3%82%B3%E3%83%B3%E3%83%9E%E5%8C%BA%E5%88%87%E3%82%8A+%E3%82%AB%E3%83%B3%E3%83%9E%E5%8C%BA%E5%88%87%E3%82%8A+%E5%87%BA%E5%8A%9B+%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)も、独自実
【Golang】文字間の複数ホワイトスペースを削除して1つのスペースに置き換える関数
> Go 言語(以下 Golang)で、文字列内の文字間にある複数スペースを 1 つに変換したい。
> つまり、**単語間の空白を詰めたい**のです。
>
> “`bash:こういうことがしたい(before–>after)
> ” Hello, World ! ” –> “Hello, World !”
> “Hello,\tWorld ! ” –> “Hello, World !”
> ” \t\n\t Hello,\tWorld\n!\n\t” –> “Hello, World !”
> “`[「golang 文字間の複数スペースを削除する」でググって](https://www.google.com/search?q=golang+%E6%96%87%E5%AD%97%E9%96%93%E3%81%AE%E8%A4%87%E6%95%B0%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B)も、正規表現や `
プログラミング言語Go アウトプット(4章)
# はじめに
これまでの章のアウトプットやプログラミング言語Goのアウトプットをしようと思ったきっかけなどは[こちら](https://qiita.com/AtomuIshida/items/6e05c02a2bd82f1e133d)でまとめているのでぜひ読んで欲しいです。# 4章 コンポジット型
## 重要・学びになったと思うところ
### 配列について
Go言語において、配列は“`固定長“`のため直接使われることが少ない(らしい)
しかし、よく使われる“`スライス“`を理解するためには、配列の理解は必須!配列の宣言
“`go
var a [3]int // 3個の整数の配列
“`for文を使ったインデックと要素の表示・要素のみの表示
“`go
var a [3]int{1,2,3}for i, v := range a {
fmt.Printf(“%d, %d\n”, i, v) // 0,1 1,2 2,3
}for _, v : = range a {
fmt.Printf(“%d\n”, v) // 1,2,3
}
“`
Go強化月間~開発する上で知っておくべき知見を共有しよう~ 結果発表?
こんにちは、Qiita運営スタッフです。
8月15日(月)〜9月16日(金)の期間に開催いたしました記事投稿キャンペーン「Go強化月間~開発する上で知っておくべき知見を共有しよう~」 へのたくさんのご参加、誠にありがとうございます!
今回のイベントでは、合計123名の方にご参加いただき、59本もの記事が投稿されました!
ご投稿いただき誠にありがとうございます?本テーマでは、Goを用いて開発する上で知っておくべきことについて様々な内容を記事にまとめていただきました。
投稿された多くの知見を日々の開発に活かしてみましょう :muscle:今回はご投稿いただいた記事の紹介といいね数のランキングを発表いたします!
## Qiita運営ピックアップ記事
たくさんのご投稿の中から、Qiita運営がおすすめ記事をピックアップしました!
まだ記事を確認できていない方はご参考にしてみてください!### [Go で Stack と FIFO](https://qiita.com/mattn/items/774280a746c82ee63fc0) by [@mattn](https://q
Go Moduleって何
# はじめに
GoでDockerでGoサーバーを立てるとき、改めてGo Moduleって何となったので調べたことをまとめます。# Go Moduleとは
パッケージ(Package)をまとめたもの。パッケージはコードをまとめるもの。すべてのコードはパッケージに入っている。
モジュールがパッケージの依存関係を管理する。
例えばAパッケージの関数がBパッケージの関数を使用するとする。
つまり、AパッケージはBパッケージがないと動かない、AはBに依存しているということになる。補足:goはmainパッケージのmain関数から処理が始まる。
# go mod でGoモジュールを作成する
goプログラムが入っているフォルダ内で、以下のコマンドを実行することでモジュールが作成できる。
ユニークな名前は、公開する場合はgithubのリポジトリ名、
非公開の場合はローカルでユニークな名前を付ける。
ユニークな名前とは、世界(非公開の場合はローカルで)同じモジュール名がないようにすること。
モジュールを参照するとき、同じ名前のモジュールがあったらどっちのモジュールを参照すべきかわからなくなるため
Goで2つのスライスから共通要素を取得したいときはgolang-setをつかおう
# はじめに
Goで2つのスライスの共通要素を取得する際、愚直にループを回すと以下のようになると思います
“`go
package mainimport (
“fmt”
)func ExampleIntersect() {
hoge := []string{“a”, “b”}
fuga := []string{“a”, “b”, “c”}var intersection []string
for _, h := range hoge {
for _, f := range fuga {
if h == f {
intersection = append(intersection, f)
}
}
}fmt.Printf(“%+v\n”, intersection)
// Output:
// [a b]
}
“`# Intersect(other Set[T]) Set[T]
golang-setをつかいます
https://github.com/deckarep/golang-set
`target.Int
Ory Kratosをセルフデプロイ&SSO設定(GitHub)
# はじめに
はじめまして。あかこうです。
最近Ory Kratosを使っているのですが、
その備忘録をここに書きなぐっておきます。本記事でまとめられているのは、以下の内容です。
1. Ory Kratosをセルフホストする
2. Ory KratosにGithubでSSOする(※本番用のデプロイではないです。)
# 1. Ory Kratosをセルフホストする
以下のコマンドで、Ory Kratosをセルフデプロイできます。。
[参考にした公式サイト](https://www.ory.sh/docs/kratos/quickstart#clone-ory-kratos-and-run-it-in-docker)“`sh
git clone https://github.com/ory/kratos
cd kratos
docker-compose -f quickstart.yml -f quickstart-standalone.yml up –build –force-recreate
“`うまく動けば、http://0.0.0.0:4455/
PostGISベクトルタイルサーバーの比較: tegola/martin/pg_tileserv
## 概要
通常、ベクトルタイルはGeoJSONなどから変換した静的なファイルとして配信されることが多いです(.pbfファイルの配信)。パフォーマンスやサーバーのコストの観点ではベストな方法と言えますが、いくつか典型的な問題があります。
– 変換に大きなコストがかかる(特にplanet級の、タイル数が膨大な場合に問題となる)。
– データの追加・削除や更新が苦手そんなわけで、データベースから動的にタイルを配信出来ることはとても重要です。しかしこのアプローチにもパフォーマンス面などで課題があるため、どの方法をなぜ採用するのか、よく検討する必要があります。
FOSS4Gの世界のデータベースといえばPostGISです。世間では、PostGISのテーブルからベクトルタイルを動的に配信するためのアプリケーションがいくつか実装されています。
– [t-rex(Rust)](https://github.com/t-rex-tileserver/t-rex)
– [tegola(Go)](https://github.com/go-spatial/tegola)
– [martin(Ru
【Go】Templateで二次配列の要素を指定する
二次配列array[index1][index2]をHTML、Goテンプレートで指定する書式は下記の通りです。
“`html
{{.array index1 index2}}
“`
Go言語 : インターフェース(&循環参照の分離)
## インターフェース
インターフェイスは、実装と使用を分離することが出来る。
また、Go言語のインターフェースは「循環参照」を解決するためにも使われる。#### 循環参照
Go言語ではパッケージの循環参照が禁止されている。
循環参照というのは、パッケージAとBがお互いに参照しあってるということ。
循環参照の禁止は、レイヤードアーキテクチャを実現することに寄与する。
しかし、時に、循環参照の禁止は厳しすぎる制約となり、プログラム作成の障害となってしまう。
そこで、インターフェースを用いてパッケージを循環参照から切り離し、循環参照可能な仕組みを作ることもある。## ファイル構造
dog/
Dog.go
DogLoar.go
cat/
Cat.go
DogInterface.go
main.go## ポイント
Dog.go“`Go
func (d *Dog) GetDog() string {
cat := &cat.Cat{ Ca
曖昧にしないためのDockerコンテナ内のディレクトリ構造(抜粋)について(Golang/PostgreSQL編)
Dockerを更に使いこなすため、Dockerコンテナ内のディレクトリ構造を分析してみた。(Treeコマンドが使えないようで、使えるように設定するのも手間なので、すべてマニュアルでディレクトリをのぞきながら階層を記録した。)
Dockerを使いこなすためには、どのディレクトリをバインドマウントさせるか?どのディレクトリをボリュームマウントさせるか?またどのディレクトリがパスが通っていてシェルスクリプト(.sh)を置くのに最適か、など、ローカル側のOSだけではなく、コンテナ側のディレクトリ構造の絵姿についてもある程度の理解が重要になってくる。
なお、分析に当たってはLinuxのFHS(Filesystem Hierarchy Standard)の理解がとても重要になってくるが、このFHSについては他に良記事が沢山あるためそちらを参照願いたい。:::note warn
下記ディレクトリは見やすくするためにアルファベット順にはしておりません。また、GolangとPosrgreSQLは通常別々のコンテナにインストールされることが多いかと思いますが、紙面の都合上、マージして記載していま
GO言語で、確保した配列に、Mapデータからデータ入力する方法
# 前置き
SQLの汎用性があるプログラムを自作中にSQLからデータを読み取る際に、読み取ったデータを配列に変換させる際で汎用性プログラムが作れないか試してみたので、記録する・## 説明など
構造体を作ったり操作するためにreflect関数というだいぶ便利なものがあるのでデバッガと組み合わせていろいろと試していた。
ポインタ操作がかなりめんどくさいけど、一つづつ調整していくと出来上がるものができたからだいぶ楽になった。## 実装プログラム
“`golang:main.go
package mainimport (
“fmt”
“reflect”
)func mapToStruct(s map[string]interface{}, i interface{}) {
sv := reflect.ValueOf(i)
if sv.Type().Kind() != reflect.Pointer {
fmt.Println(sv.Type().Kind())
return
}
if len(s) == 0 {
return
}
ii :=
【Go言語】Windows10環境でLinux用の実行ファイルを作成する
# そもそも
Windows環境で go build するとWindows用の実行ファイル(.exe)しか作成されないので、その他のOSに対応した実行ファイルをWindows環境で作成してみます。とりあえずLinux版から。
今回の環境は以下の通り。## 今回使用する環境
### 1. OS
エディション: Windows 10 Pro
バージョン: 21H2### 2. 使うもの
* [MinGW-w64](https://www.mingw-w64.org/)
* MinGW(Minimalist GNU for Windows)は32bit環境向けのため、64bit環境向けの派生版MinGW-w64をインストールして使用します。## 1. MinGW-w64のダウンロード
[MinGW-w64のダウンロードページ](https://www.mingw-w64.org/downloads/)でWindows版(MingW-W64-builds) を選択します。
![image.png](https://qiita-image-store.s3.ap-nort