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

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

Go言語でWebAssemblyを実装

## 簡単なWebAssemblyを実装

モジュールディレクトリの作成と**go.mod**を生成します。

“`sh
mkdir wasm
cd wasm
go mod init example.com/wasm
“`

**main.go**を作成します。

“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello, WebAssembly!”)
}
“`

Go言語のビルドコマンドに環境変数**GOOS = js**、**GOARCH = wasm**を設定して、**main.go**をWebAssembly用にコンパイルして**main.wasm**を生成します。

“`sh
GOOS = js GOARCH = wasm go build -o main.wasm
“`

**main.wasm**だけでは動かないので、**wasm_exec.js**(JavaScriptサポートファイル)をコピーします。

“`sh
cp “$(go env GOROOT)/misc/wasm/wa

元記事を表示

[GORM]複合主キーによるDeleteのSQL文

[GORM](https://gorm.io/ja_JP/)の[Delete()](https://gorm.io/ja_JP/docs/delete.html)のSQL文が、複合主キーの場合に、少しイレギュラーであったため、書き留めました。

+ 環境
“`
go 1.17
mysql 5.7

gorm.io/gorm v1.22.0 ( GORM自体のv2に当たる。v1は、jinzhu/gormの方 )
gorm.io/driver/mysql v1.1.2
“`

以下のような複合主キーのテーブルの場合に、
“`golang
type Item struct {
Pk1 string `gorm:”primaryKey;autoIncrement:false;”`
Pk2 string `gorm:”primaryKey;autoIncrement:false;”`
Name string
}
“`

GORMの[Delete()](https://gorm.io/ja_JP/docs/delete.html)を使うと、
“`golang
item :=

元記事を表示

wailsにEchoを導入したら「blocked by CORS policy」が発生したのでCORS対応する

![go-1.17](https://img.shields.io/badge/go-1.17-brightgreen) ![wails-v2 beta](https://img.shields.io/badge/wails-v2.0.0(beta)-brightgreen) ![echo-v4.7.2](https://img.shields.io/badge/echo-v4.7.2-brightgreen)

## 前提
– wailsに別のweb frameworkを用いたい
– wailsにReactとEcho( https://echo.labstack.com/ )を用いてアプリケーションを作ってみた
– CORSのエラーが発生した

## 結論
– EchoにCORSの設定を行う
– 勉強目的でWebフレームワークを入れたがwailsでいろいろやってくれているので煩わしい気がする

## 事象
wailsにEchoを導入してfetchして見たところ下記エラーが発生しました。

![image.png](https://qiita-image-store.s3.ap-nor

元記事を表示

GORMでデータベースのレコードが削除されない時の対処法

# はじめに
Gormを使用してデータベースを操作していましたが、レコードを削除した際にアプリ上で見ると消えているもののデータベース上には残っていることに気が付きました。
筆者の場合は、ユーザーのメールアドレスを一意な値にしたことで、「新規登録」→「ユーザー削除」→「同じアドレスで再登録」した際にデータベースでエラーが起きていました。

# 対処法
対処前に書いていたユーザー削除のコードは以下になります。

“`go
func DbDeleteUser(id int) {
d := db.GormConnect()
d.Delete(&User{}, id)
defer d.Close()
}
“`

この書き方だと、論理削除といってレコードがデータベースから物理的に削除されるわけではなく、通常のクエリ系のメソッドで検索できなくなるだけのようです。

https://gorm.io/ja_JP/docs/delete.html

対処後のコードは以下になります。

“`golang
func DbDeleteUser(id int) {
d := db.GormConn

元記事を表示

compile: version “go *.**” does not match go tool version “go *.**”エラーの解決

# compile: version “go *.**” does not match go tool version “go *.**”エラー

goの環境構築していてhello worldさせるために、
はりきって` go run hello.go `をしたら上記のエラーがでた。

## エラー内容
“`
# unicode/utf8
compile: version “go1.16.2” does not match go tool version “go1.17.8”
# runtime/internal/sys
compile: version “go1.16.2” does not match go tool version “go1.17.8”
# internal/unsafeheader
compile: version “go1.16.2” does not match go tool version “go1.17.8”
# internal/race
compile: version “go1.16.2” does not mat
“`

goenvを使って

元記事を表示

【GO環境構築】環境構築をしてVSCodeで少し動かすまで

### ゴール
Go言語の基礎が始められる状態にする

Go言語の基礎

https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/02.1.html

a tour of Go

https://go-tour-jp.appspot.com/list

### 環境
– mac

### 環境構築に必要なこと
– インストール
– コマンド実行 `brew install go`
– 環境変数の設定
– パス追加とGOPATHの設定
– `export GOPATH=$HOME/go`
– `export PATH=$PATH:$GOPATH/bin`

– ディレクトリの作成
– 環境変数GOPATH配下「bin」「pkg」「src」のフォルダを作成
– `mkdir -p go/bin`
– `mkdir -p go/pkg`
– `mkdir -p go/src`

– VSCodeの設定

元記事を表示

初めてGo(Gin)でアプリケーションを作る時に直面した壁とその解決法

初めてGoを使用し、文法もよくわからない状態でWebアプリケーションを開発しようとしたとき、他言語と勝手が違ったり、動的な言語(Perl,PHP,Python,Rubyなど)と違って型があったりして「いつもやっていることができない」となった際の事象や解決法を残しておきたいと思いこの記事を書くに至りました。

## 前提
– 使用したフレームワーク
– Gin
– 動作環境
– Docker20.10.8
– アプリの詳細
– 求人サイト
– 一般的なWebアプリケーションにあるDBからデータを取得して表示する/データを登録するといったことができる

## Ginの恩恵を受けた箇所
Goのフレームワークは基本的にフルスタックではないので、なにからなにまでGinのお世話になったわけではなく、通信周り(ルーティング)やセキュリティ周り(セッションなど)が主なGinの出番でした。そのため今回紹介するのはこうした部分がメインとなります。

Ginによって楽に実装できたものの、Ginについての情報が少なく、これらの手法を見つけるのに苦労したため、残しておきたいと思

元記事を表示

go mod vendorとは何ぞや

## そもそもvendorとは?
vendorは `go get`でダウンロードするモジュールを`GOPATH/pkg/mod`ではなく、プロジェクトのルートディレクトリに置くことができる仕組みのこと。
import時の挙動としては、`GOPATH`よりも優先して`vendor`ディレクトリのモジュールを探しにいく。

### なぜvendorが必要?
1つのPCで複数のGoプロジェクトがあるとする。複数のプロジェクトでそれぞれ違うバージョンのモジュールが必要になったとき、昔のGoはvendorを使うしかなかった。つまり、今は不要!(ただ、あると便利)
## go mod vendorとは?
`go mod vendor`は `go get`の後に実行するコマンドで、`GOPATH`にあるモジュールをプロジェクトルートディレクトリにある `vendor`ディレクトリにコピーするコマンドである。

## vendorはgitの管理下に置く
こうすることで、`git clone`したらすぐ動作確認ができたり、docker buildやCIで楽をすることができる。
`node_module

元記事を表示

プロセスとスレッドについて調べた

# 0. はじめに

Goでgoroutineやchannelの実装に出くわしたときに、雰囲気で見過ごしていたので基礎から整理する。

# 1. プロセスとスレッド

## プロセス

– 独立のメモリ空間を保有している処理の単位。
– プロセス間では基本的にメモリは共有されない。
– 1つ以上のスレッドから構成される。

## スレッド

– 1つのプロセスに割り当てられたメモリ内で動作する処理の単位。
– スレッド間ではメモリが共有される。
– スレッド間では同じデータに簡単にアクセスできる。

### シングルスレッドとマルチスレッド

– シングルスレッドとは、処理を上から順番に実行していくこと。
– マルチスレッドとは、処理効率を上げるなどの目的で、複数の処理を並行して行うこと。
– 例えば、時間のかかる操作を別スレッドで実行することで、ユーザー操作の受付を中断することなくプログラムを動かすことが可能になる。

# 2. マルチプロセスとマルチスレッドの違い

– どちらも処理を並行して行う技術。
– マルチプロセスの場合、プロセス間では基本的にメモ

元記事を表示

[Go] os.Stdin・os.Stdoutを用いた関数・メソッドのテスト

# テストケースの失敗例と解決策
Go言語でサポートされているテスト自動化ツール`go test`において,標準入出力を用いた関数・メソッドのテストを行う際にはひと工夫必要になる.

例として以下の関数をテストする場合を考える.
“`golang:sample.go
/* パッケージ,インポート文は省略 */

// isFooは標準入力から文字列を受け取り,
// それが”Foo”と等しければtrueを,異なればfalseを返す.
// 比較の結果に加え,エラーが発生した場合はそれを,そうでなければnilを返す.
func isFoo() (bool, error) {

// 標準入力を読み取るScannerを取得.
scanner := bufio.NewScanner(os.Stdin)

// スキャンを行い,エラーが有ればそれを返す.
scanner.Scan()
if err := scanner.Err(); err != nil {
return false, err
}

// スキャンした文字列と”Foo”を比較した結果を返す

元記事を表示

Go言語でCUIベースのテキスト型アドベンチャーゲームを作りました

Go言語はモダーンなプログラミング文法を持ち、マルチスレッド処理が得意な
「ハイ・エンド」なコンピュータ言語なのに、CUIベースのテキスト型
アドベンチャーゲームを作りました。

下記のURLからZIPファイルをダウンロードできます
(実行には Goコンパイラが必要です。verは多分、1.13以上であれば大丈夫)

https://github.com/new-doumeishi/travel_to_search_X.git

このゲームは主人公の「たかし」が東京の街を移動して「たい焼き器」を探す
というゲームです。
各街で「探す」コマンドで探せますが、誤って爆弾を引いてしまうことが
あります。
「たかし」は無事に「たい焼き器」を探すことができるでしょうか。

元記事を表示

[Go] RuneCountInStringで文字列の文字数を取得

`Go` にて文字列の文字数を取得したい時に

`len` の場合

`byte`で数えるまたは一つの `Unicode character`は`1~4`bytesが使われるため

英語以外の文字列はうまく文字数を取れないことがあります。

`unicode/utf-8` パッケージの `RuneCountInString` 関数を使えば

文字列の文字数を取得できるようになります。

“`go
package main

import (
“fmt”
“unicode/utf8”
)

func main() {
name := “テスト太郎”
fmt.Println(“len:”, len(name))
fmt.Println(“RuneCountInString:”, utf8.RuneCountInString(name))
}
“`

“`zsh:output
len: 15
RuneCountInString: 5
“`

元記事を表示

Go1.18がリリースされたので、早速Goのバージョンアップ

2022年3月16日、Go1.18がリリースされました。
https://go.dev/blog/go1.18
待望のジェネリックス機能が使えるようになったので、早速Goのバージョンアップです。

## ダウンロード
Go1.18が公開されたばかりなので、公式サイトからダウンロード・インストールします。
https://go.dev/dl/

デフォルト設定では、`/usr/local/go`配下にインストールされるので、パスを通しておきましょう。
“`
~ $ which go
/usr/local/go/bin/go
~ $ go version
go version go1.18 darwin/amd64
“`

## アプリケーションでのGoのバージョンアップ
Goの標準モジュール管理`go.mod`で管理されているアプリです。
次のコマンドで`go.mod`に記載されているGoのバージョンが上がったことを確認しています。
“`
go mod tidy -go=1.18
“`

これでアプリケーションが正常に動作することも確認しています。

元記事を表示

SQLの呼び出しでプレースホルダを使う理由

# はじめに
本記事ではGo言語とMySQLを使用しています。

Go言語のdatabase/sqlパッケージのチュートリアルを読んでて、プレースホルダを使う意味について分からなかったのですが、42Tokyoで一緒に勉強している学生から教えてもらえました。

http://go-database-sql.org/retrieving.html

> You should, in general, always prepare queries to be used multiple times. The result of preparing the query is a prepared statement, which can have placeholders (a.k.a. bind values) for parameters that you’ll provide when you execute the statement. This is much better than concatenating strings, for all the usual reasons (

元記事を表示

(競プロ)Goで挑戦するAtcoder Beginner Contest 243の復習(A~E)

# 初めに
 なんとなく競技プログラミングを再開することにしたのでその復習をここに残しておきます。ちなみに私は茶色コーダーなのでE以降は解けていないです。
 今回はバーチャル参加しましたが、今後も余裕があれば時間を測って昔のコンテストでも解いてみようと思います。

# A – Shampoo
[A – Shampoo](https://atcoder.jp/contests/abc243/tasks/abc243_a)
これは最初そのままvをaやbと比較したものを提出しましたが、普通にWAで(a+b+c)との剰余をとるのを忘れていました。
以下ACだった実装です。

“`
package main

import (
“fmt”
)

func main() {
var v, a, b, c int
fmt.Scan(&v, &a, &b, &c)
v = v % (a + b + c)
if v < a { fmt.Println("F") } else if v < a+b { fmt.Println("M") } else { fmt.Println(

元記事を表示

Go1.18がでたのでコレクション操作とかいくつか触った記録

## [github.com/samber/lo](https://github.com/samber/lo) をつかったコレクション操作

“`go
package _go

import (
“github.com/samber/lo”
“github.com/stretchr/testify/assert”
“testing”
)

func TestLodash(t *testing.T) {

type ArtistID int

type Artist struct {
ID ArtistID
Name string
Age int
}

type ArtistMap = map[ArtistID]Artist

artists := []Artist{
{
ID: 1,
Name: “A”,
Age: 25,
},
{
ID: 2,
Name: “B”,
Age: 45,
},
{
ID: 3,
Name: “C”,
Age: 30,
}

元記事を表示

validatorの *csfield タグはArray, Slice, Mapのlenを比較したい時につける

## この投稿で使用している言語、ライブラリのバージョン

* Go v1.17.7
* [github.com/go-playground/validator](https://github.com/go-playground/validator) v10.10.0

## 疑問に思ったこと

validatorのタグには、`gtecsfield`と`gtefield`や、`ltcsfield`と`ltfield`といった`cs`付きとそうでないものがあります。

この違いは何か?

例えば `gtecsfield`/`gtefield`は以下のような説明があります。

| Tag | Description |
|:———–|:————|
| gtecsfield | Field Greater Than or Equal To Another Relative Field |
| gtefield | Field Greater Than or Equal To Another Field |

この説明を読んで、ある構造体Aが別の構造体Bを持ってい

元記事を表示

golang template

テンプレートの定義にはdefineを使う。

“`html
{{ define “TemplateName” }}
{{ template “child” }}
{{ end }}
“`
テンプレートの使用
“`html
{{ tempalte “TemplateName” }}

{{ define “child” }}
HTML Text
{{ end }}
“`

## 追記
ginのrouterでテンプレートを読み込むと
上記のやり方だと1つのファイルの内容しか反映されない。
解決方法は

“`base.tmpl.html
{{ define “top” . }}





{{ end }}

{{ define “bottom” .}}

{{ end }}
“`

“`some.tmpl.html
{{ template “top”}}

Your contents.

{{ template “bottom }}
“`

一般的に使われてる命名
l

元記事を表示

Golangでは暗黙的な型変換もあることを知ってた?

## 環境

“`bash
Go version: go1.17.8
“`

## コード

下記のコードにあるように、
明示的に変換しないとエラーになるタイプ (`int`) と
変換せずにそのまま代入できるタイプ (`map[string]int`) があることがわかります。

“`golang
package main

import (
“fmt”
“runtime”
)

type MyInt int
type MyMap map[string]int

func main() {
fmt.Printf(“Go version: %s\n”, runtime.Version())

var x MyInt
var y int
x = y // コンパイルエラー: cannot use y (type int) as type MyInt in assignment

var m1 MyMap
var m2 map[string]int
m1 = m2 //  OK
m2 = m1 // O

元記事を表示

Gopherくんの動く壁紙を作ったwww

# 動く壁紙とは?
Windowsでゲームをプレイする方なら知っているかもしれませんが、[Wallpaper Engine](https://store.steampowered.com/app/431960/Wallpaper_Engine/?l=japanese)という壁紙を設定するアプリがあります。(Steamで300円程度)
このアプリでは、自分好みの壁紙をダウンロードしたり、自分で壁紙を作成することもできます。
そして壁紙として登録できるのは画像だけでなく、動画やUnityで作成したプログラムなんかもあります。
[Wallpaper Engineで動かせるプログラムをUnityで作る](https://qiita.com/mochi5420/items/010d5571c441f4bc6a4c)

自分もこのWallpaper Engineで、コロコロ動くBB-8(スターウォーズに出てくるロボット)の壁紙を使ってます(かわいい)。
さて、そんなある日(?)[本物の golang を… 本物の Gopher を、お見せしますよ。](https://qiita.com/mat

元記事を表示

OTHERカテゴリの最新記事