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

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

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`の部分はお好きなプロジェクト名を入れてください

元記事を表示

Dockerでスクレイピング環境構築

自分1人では、環境をサクッと構築しスクレイピングしていましたが、メンバー間で共有したいときに面倒だったのでDockerで再現しました。
GoではHTMLの操作に、Agoutiを使用。
HTML解析には、goqueryを使っています。

# サンプルコード
“`:main.go
package main

import (
“log”
“strings”

“github.com/PuerkitoBio/goquery”
“github.com/sclevine/agouti”
)

func main() {
log.Println(“処理開始…”)

// ChromeDriver
driver := agouti.ChromeDriver(
agouti.ChromeOptions(“args”, []string{
“–headless”,
“–window-size=1280,800”,
}),
agouti.Debug,
)

if err := driver.Start(); err != nil {
log.Fata

元記事を表示

GoでAPIを作る際の技術選定

## 概要
GoでAPIを作ることになったので、ライブラリやアーキテクチャの検討をした際のメモ

## Web framework
:star: Gin

https://gin-gonic.com/

標準ライブラリの[net/http](https://pkg.go.dev/net/http)でもよかったけど、フレームワークを使って楽できるところはしたかった
その他にも[echo](https://github.com/labstack/echo)や[chi](https://github.com/go-chi/chi)など選択肢は豊富だが、2022/03時点でGinが最も人気が高そうで、触ってみて問題なさそうだったので

https://github.com/mingrammer/go-web-framework-stars

## API specification
:star: swag

https://github.com/swaggo/swag

コード内のコメントからSwaggerドキュメントが生成でき、Swagger UIも使えて便利
複数のフレームワークをサポート

元記事を表示

Golang-文字数を数える方法,4バイト以上の絵文字もある

## 背景

こちらの記事 [UTF-8 のテーブル(MySQL5.6)に竈門禰?豆子が格納できない問題を調べてみた](https://qiita.com/ykami/items/d45ec72f8a5ea8b3288d)がきっかけで、
`Golang`における絵文字の文字数を確認する方法を調査して見ました。

ちなみに、`Golang` のソースコードや文字列リテラルは `UTF-8` が採用されています。
`UTF-8` は、英数字は 8bit で表現して、それ以外は 16,24,32bit で可変的に表現しています。
例えば、ひらがなカタカナ漢字の様な日本語は 2 byte のものが多いのですが、上記の記事にでもあった一部の異体字([wikipedia](https://ja.wikipedia.org/wiki/異体字セレクタ))は 4 byte だったりします。

あと、? とかの絵文字も 4byte のものが多いのですが、
?‍?‍? や ?‍?‍?‍? といった絵文字は複数の絵文字を組み合わせた絵文字で、 4byte 以上になったりします。

## 確認用コード

Go

元記事を表示

Golang同じ文字列を繰り返して連結する方法

## Golang での同じ文字列を繰り返して連結する方法

– 環境

“`bash
$ go version
go version go1.17.2 darwin/amd64
“`

– 方法

“`golang
package main

import (
“bytes”
“strings”
)

func main() {
// repeat byte
bufBytes := []byte(“?”)
println(“repeat byte:” + string(bytes.Repeat(bufBytes, 3))) //???

// repeat strings
str := “?”
println(“repeat strings:” + strings.Repeat(str, 3)) //???

// repeat rune
// rune 型のスライスにはrepeat関数が用意されていないため、for 文を使う必要がある。
bufRunes := []rune(“?”)
for i := 0; i < 3; i++ { bufRune

元記事を表示

Slack でタコピー風に会話する

「Slackでの文章が怖い」と言われたので何か改善できないかと思い、まずはメッセージを全てタコピー風にする CLI を Go で作成しました。(GitHub でスターをくれると喜びます。)

https://github.com/Code-Hex/takopi

## タコピー?

タコピーは「タコピーの原罪」という少年ジャンプ+で連載中の漫画のキャラクターです。「っピ」を語尾につけるのが特徴なので文章を柔らかく見せてくれるだろうと考え採用しました。

## CLI の作成

Go 有名な形態素解析ライブラリ [github.com/ikawaha/kagome](https://github.com/ikawaha/kagome) を利用しています。

文章を加工するためにいくつか工夫しました。

1. メッセージを正規化する
2. 正規化済みの文字列に対して形態素解析を行う
3. 置き換えたい内容が見つかれば置換する

置き換えたいものは map として[定義](http

元記事を表示

レシピ作家のレシピを検索できるトイアプリがちょいバズったので爆速でLINE Botを作った話

こんにちは、家庭では休日の料理担当をしている二児の父です。

山本ゆりさんやリュウジさんなど有名レシピ作家さんのレシピをよく参考にするのですが、ブログ記事、Instagram、Youtubeなど皆さん複数のチャネルにレシピを公開してて探しにくいなぁと常々思っていたため、チャネル横断でレシピを検索できる、制作期間わずか3日の[トイアプリ](https://couch-potato.vercel.app/yuri-yamamoto)を公開してTwitterでお知らせしました。

すると山本ゆりさんご本人がリアクションしてくださり(!)、フォロワー数100人ちょっとだった自分のツイートにいいね!が止まらない状況に。これに気を良くして、さらに**近所のスーパーで安くなってる食材を調べて、関連レシピを検索できる機能**を追加してLINE Botにしてみたよ、という話です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201783/607570ad-0bfd-f3e9-b08d-685ee3d

元記事を表示

go、パス

# パス
GOROOT
goのsdkの場所なのであまり触る必要がない。
またgoは後方互換性があるように作られているので普通に最新のバージョンにすればいいだけなので、あまり触ることはない。

GOPATH
go用のワーキングスペースを決める。
GOPATH/src/にプロジェクトを作成する。

https://pleiades.io/help/go/configuring-goroot-and-gopath.html#:~:text=GOPATH%20%E3%81%AF%E3%80%81%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE,%E3%80%81%25USERPROFILE%25%2Fgo%EF%BC%89%E3%80%82

https://www.techscore.com/tech/Go/Lang/Basic2/

元記事を表示

GoでHTML (+ CSS, JavaScript) を表示する

# 問題
Go言語でサーバーを立ち上げてHTMLを表示させる際、cssとjsファイルをHTMLに適用させるのに少し時間がかかりました。
備忘録としてHTML + CSS + JavaScriptのページを表示する方法を記載していきます。

# 解決方法
結論から言うと、go:embedを使用しました。
下記のテックブログを参考にして、静的ファイルを変数に格納 -> ファイルシステムを取得して読み込むという方法で課題を解決しました。

https://future-architect.github.io/articles/20210208/

下記にコードを記載しますが、全てを記載すると記述が多くなるため省略してあります。
全コードが気になる方はgitを確認してください。
https://github.com/Makoto87/test_go_embed

goのバージョン
“`
go version go1.17.3 darwin/amd64
“`

ディレクトリ構成
“`
.
├── go.mod
├── main.go
└── views
├── main.html

元記事を表示

【対処法】unable to open tcp connection with host ‘localhost:1433’: dial tcp [::1]:1433: connectex: No connection could be made because the target machine actively refused it.

社内ツールの開発を試みてGoでSQLserverを扱っている公式チュートリアルを進めていたところ、タイトルのエラーに遭遇して少し苦戦しました。その対処法を記事にします。
[https://www.microsoft.com/en-us/sql-server/developer-get-started/go/windows/step/2.html](https://www.microsoft.com/en-us/sql-server/developer-get-started/go/windows/step/2.html)

## TCPIPを無効から有効に切り替える

![sqlserver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951392/70c34883-1186-6d85-e65a-9d9d29098bee.png)

以下に対処法が書いてありましたが英語なので見逃してしまう方がいるかもと思い記事にしました。
[https://community.grafana.com/t/not-ab

元記事を表示

GoのCLIでテキスト入力をVimとかでやりたかった件

# はじめに
CLIのTwitterクライアントとか作りたいなー って思った
なので、複数行のTweetをコマンドラインで入力するんだったら、Vimとか使いたいなーって思った

## ググった
[GoでVimを開いて編集内容をパースする方法](https://qiita.com/lighttiger2505/items/d3b9ee9884c75a7819d8)
最高やん!

## 結果
[kotaoue/go-eeditor](https://github.com/kotaoue/go-eeditor)を用意した

“`Go
import (
“fmt”

“github.com/kotaoue/go-eeditor”
)

func main() {
editor := eeditor.NewEditor()
b, _ := editor.Open()
fmt.Println(string(b))
}
“`
みたいなコードで、Vimでテキスト編集した結果をbyteで受け取れる

起動時のパラメータ変更すれば、Emacsも使える
“`
editor := eedito

元記事を表示

【Golang】”net” モジュールを使った静的リンクバイナリを Docker + scratch で使う際のビルドの注意【”net/http” “net/url” など】

> Go 言語(以下 Golang)v1.16 以降で、”`net`” モジュールを使ったバイナリを Docker のマルチステージ・ビルドでコンパイルし、`scratch` イメージで使いたい。

例えば “`net/http`” や “`net/url`” パッケージなどを使って `HTTP GET` リクエストするものなど。しかし、静的リンクしないと `standard_init_linux.go:228: exec user process caused: no such file or directory` エラーが発生するし、静的リンクさせてもデータが取得できない。

**Go v1.16 + Docker v20.10 以降で動く情報**が欲しかったのですが、色々ググっても Go v1.**4** 時代の古い情報や、古い Golang と Docker のバージョンの組み合わせ情報しかありませんでした。あっても新旧混在の組み合わせだったりと、なかなか動かなかったので未来の自分のググラビリティとして。

## TL; DR (今北産業

元記事を表示

[Go][AtCoder] bufio.NewScannerの標準入力でハマったこと 最大サイズ

## 概要

最近Golangを書くことが多くなりました。普段はWeb開発ばかりやってますがそれ以外にも前から競プロに興味がありました。
なのでせっかくなのでGolangで始めてみようかなと思い立った矢先、いきなり問題にハマったのです。

ただ学びにもなったので備忘録としてこの記事を書いています。

## ハマってしまった問題

僕がハマってしまった問題は下記です。

問題としては入力文字列を昇順にソートして出力するだけのものでシンプルなものです。

https://atcoder.jp/contests/abc242/tasks/abc242_b

僕の提出回答は下記でした。

一見ACになりそうなのですが、結果としてはWAでした。

やっていることとしては間違っておらずでして、

受け取った文字列からstring型のsliceを作成して1語ずつ格納します。

その後, `sort.Strings([]string)`を使ってsliceを昇順にソートします。

最後は`strings.Join`を用いて文字列を作成して出力で完了です。

でも何が原因でWAになってしまうか分からず、

元記事を表示

OTHERカテゴリの最新記事