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

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

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

元記事を表示

Golang, MySQL, nuxt.jsで動かしてみる。

## Docker環境構築
– バックエンド側のコンテナ内で`go mod init {$MODULE_NAME}`し`go.mod`ファイルを作成する
– このファイルは直接さわらずに、コマンドを実行にて変更する
– `go get github.com/labstack/echo/v4`でEchoをインストールする
– [参考 / Gin Web Framework](https://github.com/gin-gonic/gin#installation)

## Go(バックエンド)
– フレームワークはEchoを使ってみる
– RestAPIに適しているとのこと

## Nuxt3(vue3:vite)
– Vueのフレームワーク 
– tailwindを使う [参考](https://tailwindcss.com/docs/guides/nuxtjs)

### Error: Unknown at rule @tailwind CSS 
– vscode拡張機能の`PostCSS Language Support`をインストールする

### Error

元記事を表示

【Golang】Ginを使ってフラッシュメッセージを表示させる

# はじめに
Ginでフラッシュメッセージを実装する情報があまり見つからなかったため、備忘録として残します。
コードが冗長的だったり、良い書き方ではなかったりするかもしれませんが、ご了承いただければと思います。

# フラッシュメッセージ機能の実装
フラッシュメッセージを表示させるために、Cookieに一時的に保存しすぐに削除することでリダイレクトされた時のみ表示するようにしています。

“`golang:flash/flash.go
package flash

import (
“github.com/gin-gonic/gin”
)

func SetFlash(c *gin.Context, status string, msg string) {
c.SetCookie(“Status”, status, 1, “/”, “localhost”, true, true)
c.SetCookie(“Msg”, msg, 1, “/”, “localhost”, true, true)
}

“`
“Status“にはメッセージの種類(success,danger等

元記事を表示

マイコン操りたいのでtinygo環境構築とgoroutineしてみた

# あらすじ
会社で使用している機器のGPIO機能をテストしようと思ったので環境構築して使ってみたの巻。

# tinygoを入れる
https://tinygo.org/getting-started/install/windows/
これに従えばOK。
scoopを使わずにManual Installに従ったほうがシンプル。
好きなところに解凍してexeにpathを通す。

# avrのツールを入れる
お手軽なのはArduino IDE内のavrdudeにPathを通す方法。
`C:\Program Files (x86)\Arduino\hardware\tools\avr\bin`
とかにあるはず。

# その他
LLVMと本家goが必要といわれたらこれらもPathを通す。

# コーディングする
今回使用するのはESP32くん。
tミリ秒で無限にLチカする関数を用意し、500msと300msでトグルするようにして呼び出す。
goキーワードを書き足すだけで以降の処理と並行して実行されるらしい。なんかすごい!

“`golang:main.go
package main

im

元記事を表示

Golang + gorilla/mux + LambdaProxyIntegration + ServerlessFrameworkを動かすまで

# 概要
タイトル通り、GolangアプリケーションをLambdaプロキシ統合で動かします

## Lambdaプロキシ統合ってなに
ここに書いてある

https://docs.aws.amazon.com/ja_jp/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html

これを使うとLambda関数を小分けにしなくても、アプリケーション側でルーティングを振り分ける従来の開発方法でサーバーレスなアプリケーションが作れる

## 必要なもの
・AWSアカウント
・ServerlessCLI
インストール、認証情報の設定が必要です

公式ドキュメント

https://www.serverless.com/framework/docs/getting-started

## 実装
`sls create –template aws-go-mod –path go-test`
テンプレートから雛形を作ってもらいます
`go-test`の部分はお好きなプロジェクト名を入れてください

元記事を表示

OTHERカテゴリの最新記事