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

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

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

元記事を表示

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/

元記事を表示

OTHERカテゴリの最新記事