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

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

【Golang】fmt.Errorfとerrors.Newの違い

### 変数を埋め込みたい時は `fmt.Errorf`を使う
“`go
err := fmt.Errorf(“error create token: %w”, err)
“`

### 固定の文字列の時は `errors.New`を使う

“`go
err := errors.New(“invalid format”)
“`

元記事を表示

Go の rune 型を試してみる

## 前回

https://qiita.com/BitterBamboo/items/14a0d667ed4dbe2d549b

文字列を for-range で回す際に、
繰り返しの要素(1文字1文字)が `string` 型として現れることを期待していたのですが、
なんと **`rune` 型という気味の悪い型**([元ネタ](https://www.itmedia.co.jp/news/articles/1806/08/news065.html))が代わりに現れて少々困惑してしまいました。

今回はそんな `rune` 型の基本的な挙動を確認してみました。

## `rune` 型の入出力

まず大前提として、`rune` は `int32` のエイリアスであり、
さらに Unicode のコードポイント(10進数表記)に該当するのでした。

`rune` 型の変数に格納できる値は2種類あります。

* `int32` 型の数値
* `rune` リテラル

### `int32` 型の数値

“`go:int32 型の数値
package main

import “fmt

元記事を表示

Goのpackage github.com/mattn/go-sqlite3 is not a main packagetとかいうエラー

go初心者です。
go1.18 darwin/arm64を使っています。

このエラーの解決方法(個人的に)を残したいと思います。

①brew なりでsqlite3をインストールします。

②自分のPJのディレクトリでgo mod initします。
“`
go mod init github.com/mattn/go-sqlite3
“`
③go.modのあるディレクトリでgo mod tidyをします。
“`
go mod tidy
“`

これで使えるようになるはずです。

元記事を表示

【A Tour of Go】 並行処理編

公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。

**基本編**

https://qiita.com/BitterBamboo/items/58d80a1a1a85e18188ce

https://qiita.com/BitterBamboo/items/f72ce6f7ce20e6b5f6c7

https://qiita.com/BitterBamboo/items/6732a7a9fb2c904641b1

**メソッド編**

https://qiita.com/BitterBamboo/items/1fbd9ff6d0ec8d064062

**インターフェース編**

https://qiita.com/BitterBamboo/items/7f3e29b324bcc84c93ed

以下、並行処理について学んだことのメモ。

> Goは言語のコア機能の一部として並行処理機能を提供する(!)

## goroutine

* Go のランタイムによって管理される軽量

元記事を表示

オライリー書籍ランキング1[O’Reilly]

2022年5月30~6月5日の書籍ランキングを紹介します。
***
[データ指向アプリケーションデザイン[Amazon]](https://amzn.to/3aILwT3)
![c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2702119/349ec1bc-3d51-3e16-0b35-39caf4146690.jpeg)
– 第I部データシステムの基礎
– 1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション
– 2章 データモデルとクエリ言語
– 3章 ストレージと抽出
– 4章 エンコーディングと進化
– 第II部分散データ
– 5章 レプリケーション
– 6章 パーティショニング
– 7章 トランザクション
– 8章 分散システムの問題
– 9章 一貫性と合意
– 第III部導出データ
– 10章 バッチ処理
– 11章 ストリーム処理
– 12章 データシステムの将来
***
[ソフトウェアアーキテクチャの基礎[Amaz

元記事を表示

go getがつかえない。(oapi-codegenのインストール)

# Goのバイナリを取得する。

oapi-codegenを使おうと思って、`go get`したら怒られました。

go 1.17以降は`go install`を使わないとだめそうです。

“`
$ go get github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.8.2
go: go.mod file not found in current directory or any parent directory.
‘go get’ is no longer supported outside a module.
To build and install a command, use ‘go install’ with a version,
like ‘go install example.com/cmd@latest’
For more information, see https://golang.org/doc/go-get-install-deprecation
or run ‘go help get’ or ‘go

元記事を表示

5分でわかるGo言語の文法まとめ

# Java経験者から見たGo言語の文法一覧
※2020年当時書いたものを掲載しているので、Javaの言語仕様の理解が古いかもしれません。。。
ご容赦ください。

## 文法規則
### 出力
“`Main.java
public class Main {
public static void main(String[] args) {
System.out.println(“Hello, World”);
}
}
“`

“`main.go
package main
import (
“fmt”
)
func main() {
fmt.Println(“Hello World”)
}
“`
※fmtパッケージが必要

### 変数
型は最後に書く ※varは変数、letは定数

“`test.go
var c, python, java bool //c,python,javaは全てbool型
let swift bool = true //bool
“`

★初期化すれば型を書かなくてよい

“`test.go
var i, j i

元記事を表示

GoのScanfでunexpected newlineが出た話

Goのコーディング練習も兼ねて、P社の、お題に沿って簡単なプログラムを作成するとレーティングされるアレをやってました。
その中で、思いがけず「unexpected newline」エラーが発生してしまいました。
まあ、知っている人は知ってそうなので例によってポエムです。

## 現象

やりたかったのは`0101`みたいな4桁の二進文字列を読み取ること。サクッとScanfを使って以下のようなコードを書きました。

“`go:scanf_binary.go
package main

import “fmt”

func main() {
const COUNT = 2
var number_decimal int

for i := 0; i < COUNT; i++ { if _, err := fmt.Scanf("%04b", &number_decimal); err != nil { fmt.Println(err.Error()) break } } } ``` これを実際に動かすとこうなります。 ``

元記事を表示

【Golang】PHP の serialize のようにオブジェクトを保存可能なデータにしたい【gob】

Go でオブジェクトをシリアライズ(シリアル化)したい

> Go 言語(以下 Golang)で、オブジェクトを保存 & 読み込みできるように[シリアライズ](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA)したい。

JSON 文字列に変換してもいいのですが、`json.Marshaler` や `json.Unmarshaler` インターフェースを実装しないといけないものだと面倒です。

特に、ユーザーが保存データを直接編集する必要もないし、他のプログラム言語とのやりとりもない場合に、PHP の serialize くらい**簡単に保存可能な値に変換できないものか**悩みます。

[「”golang” phpのserializeみたいなもの」でググって](https://www.goo

元記事を表示

GoでZIPファイル扱う

# はじめに
PHPerだった私にはGoのZIPファイルの取り扱い方が少々ややこしかったので、忘れたときのために覚書を残すことにした。

# ZIPファイルの読み方
基本的な手順はこちら。
1. ZIPファイルを開く
1. 個別のファイルエントリーを取得
1. ファイルエントリーの情報が欲しい場合はFileHeader要素から取得
1. ファイルエントリーの中身を見たい場合はオープン
~~~go:reader.go
package main

import (
“archive/zip”
“io”
)

// エラー処理は省略
func main() {
zipfile, _ := zip.OpenReader(“./sample.zip”) // 1. ZIPファイルを開く
defer zipfile.Close()
for _, entry := range zipfile.File { // 2. 個別のファイルエントリーを取得
println(entry.FileHeader.Name) // 3. ファイルエントリーの情報が欲しい場合はFileH

元記事を表示

go開発環境をDockerで作成する③

# 最終目的
– go言語でWebアプリを構築するためのgo開発環境をDockerで作成する。

# 目標
– [Docker上にコンソール立ち上げ環境を作る。](https://qiita.com/eigetsu/items/555efb6f1fec0425d35f)
– [フレームワークginを使った簡単なREST APIサーバーを立ち上げる。](https://qiita.com/eigetsu/items/5482149b4f5cf7874698)
– イメージビルド時にプログラムをコンパイルしコンテナ起動と同時にホストPCからAPIにアクセスできるようにする。←いまここ

## 開発環境の構成

開発環境 `go-env` の構成は下記の通り。

~~~text: 開発環境
go-env/ ★ 開発環境構成 go-env はGitHubのレポジトリ
├── docker-compose.dev.yml
├── env/
│   └── Dockerfile.blog.dev ★ go-blogのDocke

元記事を表示

AWS S3のmockを作成してGitHub Actionsで自動テストを実行する

# はじめに
CRUDなWebアプリケーションを開発する際に、外部ストレージとして`AWS S3`を選定し、ファイルのアップロード処理やダウンロード処理などを実装する場合が多々あると思います。
`AWS S3`のようなマネージドサービスに依存するビジネスロジックに関しても単体テストもしくは統合テストをきちんと書き、自動テストを実行したい!! といった場合に役立ちそうな内容を記事にまとめます。

# 選定したツール
今回は`localstack`という、AWSのマネージドサービスをモッキングするためのツールを使用します。
`localstack`を使用することで、AWSの多くのマネージドサービスをモッキングすることが可能となります。
ツールを利用する際に一部有料となってしまう部分も存在しますが、今回モッキングを行いたいS3に関しては利用に際して無料となっているので、特に問題なく開発が行えそうです。

https://github.com/localstack/localstack

## 選定理由
`localstack`を選定するに至るまでいくつかの方法でS3をモックしてのテスト実行方

元記事を表示

[golang] Go言語は、map、slice、arrayは定数化出来ない仕様。では代用策は?

【参考資料】
– [Effective Go: Constants](https://go.dev/doc/effective_go#constants)
– [[Golang] array と slice と map を定数として使えない](https://tech.notti.link/02b52f2)
– [go – Declare a constant array – Stack Overflow](https://stackoverflow.com/questions/13137463/declare-a-constant-array)

【実行環境】
– Go for Windows:1.18

## 理由
定数として使えるのは「数字」「文字(runes含む)」「boolean」であり、定数はコンパイル時に生成されます。
対して配列やスライスはプログラム実行時に生成されます。

## 代用策

### 1: [要素数]string(またはint){要素1,要素2,・・・} 形式で定義。
– Pros: 直観的で、行数も少なくて済む。
– Cons: 結局は変数なので、簡

元記事を表示

【A Tour of Go】 インターフェース編

公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。

**基本編**

https://qiita.com/BitterBamboo/items/58d80a1a1a85e18188ce

https://qiita.com/BitterBamboo/items/f72ce6f7ce20e6b5f6c7

https://qiita.com/BitterBamboo/items/6732a7a9fb2c904641b1

**メソッド編**

https://qiita.com/BitterBamboo/items/1fbd9ff6d0ec8d064062

以下、インターフェースについて学んだことのメモ。

## インターフェース

### インターフェース型

* インターフェース型は、メソッドのシグネチャの集まりとして定義する
* シグネチャ: 名前, 引数や戻り値の型
* インターフェース型の変数には、インターフェースを実装した型 *(= インターフェースで定義したメソッドの

元記事を表示

Go の気になったコミット (2022 年 5 月)

[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。

前回作成したリストはこちら。

https://qiita.com/sg0hsmt/items/a23550509237e06361f2

軽く説明を追加していますが勘違いや誤りがあるかもしれません。

## Topic

– BoringCrypto を使うための `dev.boringcrypto` ブランチが master にマージされました。 :tada:
– 環境変数 `GOMEMLIMIT` でメモリ使用量のソフトリミットを設定できるようになりました。
– 標準パッケージにジェネリクスが導入されました。

## Commits

### 2022-05-02

https://github.com/golang/go/commit/32acceb359717e434ceb48681426b377b722d11e

ファイルディスクリプタに対する書き込み処理にて内部で保持している使用済みバッファが

元記事を表示

Excelデータベースをブラウザで絞り込み検索

# 概要
* サンプルデータの準備
* バックエンド実装
* HTMLテンプレート
* フロントエンド実装

## モチベーション
Excelで管理されているデータベース()のデータをFZFライクに絞り込み検索できるようにします。
全員のPC内にfzfやらターミナルやらxlsx2csvのようなツールが入っていないので、ブラウザの表示を通してサーバー経由でExcelのFuzzy検索をできるようにします。

![demo-fzf.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113494/d6df9b8d-322a-a539-cd64-f8326423d930.gif)
FZF本家の実行画面。ファイルを絞り込み検索しています。

## 完成形
![demo-excel-fzf.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113494/f501670d-b7e0-4903-b57a-0b7718a3b077.gif)
E

元記事を表示

【A Tour of Go】メソッド編

公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。

前回の記事(基本編)はこちら

https://qiita.com/BitterBamboo/items/58d80a1a1a85e18188ce

https://qiita.com/BitterBamboo/items/f72ce6f7ce20e6b5f6c7

https://qiita.com/BitterBamboo/items/6732a7a9fb2c904641b1

以下、メソッドについて学んだことのメモ。

## メソッド

### 基本

* Go にはクラスの仕組みはないが、型にメソッドを定義できる
* メソッドは、レシーバを引数にとる
* レシーバはメソッドを定義する対象となる型
* 構造体だけでなく任意の型にメソッドを定義できる
* `type MyFloat float64`
* レシーバを伴うメソッドを宣言するには、レシーバの型が同じパッケージ内に存在しなければならない

“` go
p

元記事を表示

Go 言語でスライスのポインタに対して Index を指定して要素を取得する

# Go 言語でスライスのポインタに対して Index を指定して要素を取得する

普通のデータ型のようにポインタ参照しようとするとできない。

“`go:構造体
type Users struct {
Name string
Score *[]int
}

tanaka := Users{Name: “田中”, Score: &[]int{1, 2, 3}}
satou := Users{Name: “佐藤”, Score: &[]int{1, 2, 3}}
users := &[]Users{tanaka, satou}
“`

“`go:NG パターン
for i, v := range *users {
log.Printf(“名前 %v”, v.Name[i]) // こっちはポインタじゃないので問題なし
log.Printf(“スコア %v”, *v.Score[i]) // こっちはポインタ参照してるのにダメ
}
// エラー: invalid operation: cannot index v.Score (variable of type *[]

元記事を表示

go開発環境をDockerで作成する②

# 最終目的
– go言語でWebアプリを構築するためのgo開発環境をDockerで作成する。

# 目標
– [Docker上にコンソール立ち上げ環境を作る。](https://qiita.com/eigetsu/items/555efb6f1fec0425d35f)
– フレームワークginを使った簡単なREST APIサーバーを立ち上げる。← 今ここ
– [イメージビルド時にプログラムをコンパイルしコンテナ起動と同時にホストPCからAPIにアクセスできるようにする。](https://qiita.com/eigetsu/items/a3eeffa3df2bac413dde)

## Goのフレームワークの選定
フロントエンドはWebだけとは限らない。バックエンドとフロントエンドは分け、JSONでやり取りするRESTful APIとする。
GitHubのStars、Forks、日本での利用数、Echoはリリースが頻繁なのも(良いも悪いも)気になったので、ginを選択。

https://github.com/gin-gonic/gin

## 簡単なAPIサーバーを考える

環境構

元記事を表示

ASP.NET Core Blazor WebAssembly 公開について

あ、すいません
過去に投稿された記事、現在進行系で書いている記事についてですが
あくまでも、私のメモなので
チュートリアル、ドキュメントではないので、注意してください
それでも、よかったら見てください

用事で、ASP.NET Core Blazor WebAssembly(以下blazorWasm)を使うことがあり、
アプリケーションを公開するときに、すごく困ったのでメモ;

環境
.net6.0 version 6.0.300 windows
go version go1.18.3 windows/amd64

VisualStudio 2022(以下vs2022)

vs2022のテンプレートから、アプリケーションを作成後のリリースで
Blazor Serverであれば、dllを実行できる環境でdotnet runしまえば、問題は特にないのですが、
blazorWasmには、dllがなく当時私が困ったので、今後や、たまたま記事を見つけた人のためのメモ

blazorWasmは公開後、指定のフォルダーにwwwrootフォルダーがあり、その中身が
リリースに必要なフォルダーですが、中

元記事を表示

OTHERカテゴリの最新記事