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

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

【Go net/http 各メソッド解説】

Goのnet/httpの使い方を理解する必要があったのでまとめてみた。
メモ代わりにする。

## http.ListenAndServe

サーバーを起動するよくあるやつ
第1引数にPORT番号
第2引数に**http.Handler**

## http.Handler
ServeHTTPメソッドを定義しているinterface。つまりinterface。

“`golang
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
“`

## http.ServeMux

ServeMux.Handleメソッドを使用して、URLとHandlerの登録ができる。

以下のようにすると/echoURLに対してechoHandlerを登録できる。これによってechoHandlerのServeHTTPメソッドが呼び出されるようになる。

つまり、HandlerInterfaceの実装を第2引数にわたすこととなる。

“`go
func main() {
mux := http.NewServeMu

元記事を表示

[Memo] A Tour of Go -Basics(2)-

# Using the tour

`A Tour of Go`とは
`Go`言語の最も重要な機能について説明するtourです。

https://go.dev/tour/list

## Basics – Flow control statements: for, if, else, switch and defer

### For

`for`ループはセミコロン`;`で3つの部分に分かれています。

1. init statement
2. condition expression
3. post statement

ループは、`condition expression`が false となった場合、停止します

“`Go
func main() {
sum := 0
for i := 0; i < 10; i++ { sum += i } fmt.Println(sum) } ``` 初期化と後処理ステートメントの記述は任意です。 ### For is Go's "while" `init statement`と`post statement`の記述は任意

元記事を表示

# 【Go】文字列をシングルクォートで囲む関数を作る

文字列をシングルクォート(’)で囲む関数を作りました。SQLを動的に作成するときに使いたいと思ます。

## 作成したコード

“`go
package main

import (
“fmt”
“strings”
)

func main() {
str := “Hello World”

fmt.Println(str)
fmt.Println(addSingleQuotesVer1(str))
fmt.Println(addSingleQuotesVer2(str))
}

func addSingleQuotesVer1(ret string) string {
str := []string{“‘”, ret, “‘”}
return strings.Join(str, “”)
}

func addSingleQuotesVer2(ret string) string {
return “‘” + ret + “‘”
}
“`

[https://go.dev/play/p/6k2VGNVzgD4](https://go.dev/play/p/6k2V

元記事を表示

[Memo] A Tour of Go -Basics(1)-

# Using the tour

`A Tour of Go`とは
`Go`言語の最も重要な機能について説明するtourです。

https://go.dev/tour/list

## Basics – Packages, variables, and functions

### Packages

Goのプログラムは、`package`で構成されます。
プログラムは main packageから開始されます。

“`Go
package main
“`

### Imports

このコードでは、括弧でパッケージのインポートをグループ化し、
`factored import statement`としています。

“`Go
import (
“fmt”
“math”
)
“`

### Exported names

`Go`では、
最初の文字が大文字で始まる名前は、
外部のパッケージから参照できる`exported name`です。
例えば、`Pi`は`math`パッケージからエクスポートされています。

“`Go
package main

import (

元記事を表示

初心者がGolangでDiscordBot作って痛い目にあった話

#概要
– GolangでDiscord用抽選Botを開発した
– ライブラリの挿入や構造体の定義が初心者には注意が必要と悟った

#経緯
モンハンで使うBotが作りたかった。以上!

##モンハンワールド・アイスボーン専用のBotを作っていた
毎回モンハンアイスボーンで一緒に狩猟をする友人(HR/MR:999)が

> クエストと狩猟対象もルーレットで決めたい

と~~変なことを~~言っていたため、~~HR400の私は恐怖のあまり拒否できず~~ワールドで出現する武器・モンスター・クエストを全て抽選できるBotをPythonで開発しました。名前を「受付ジョー」としています。食欲が伺える最高の名前ですね。
![スクリーンショット 2022-02-05 16.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/9d97e2ab-4854-9df1-512e-c0be4a18444e.png)
食事をするだけでなく、武器などの抽選を行ってくれます。
![スクリーンショット 2022-0

元記事を表示

gomock とgotests を使ったCleanArchitectureのusecaseテスト生成術

# 前提
– CleanArchitecture を採用する
– CleanArchitecture のusecase 層のテストをする
– repository 層はgomockによってモックが生成されている
– テストの雛形はVSCode の拡張のgotests の形に基づく[参考: VS CodeのGo言語テストコード生成ツールを使ってみたらめちゃくちゃ便利だった話とか](https://kdnakt.hatenablog.com/entry/2019/01/03/080000)

https://kdnakt.hatenablog.com/entry/2019/01/03/080000

https://github.com/cweill/gotests

# 概要

要件としてrepository 層の関数をモックとして扱う必要がある。
gotests で雛形を生成して[gomock](https://github.com/golang/mock) を用いつつ引数としてmockの初期化関数を渡してモックパターンを柔軟に設定する

https://zenn.dev/sanpo_

元記事を表示

【Udemy】聴きやすい英語のエンジニア向け優良コンテンツ(順次追記)

技術はサッパリだが英語ができるワイは最近Udemyの英語コンテンツで学んでいます。
その中で**聴きやすい英語**で**内容がとてもいい**と判断したものを追記していきます。
合う講師を見つけて、その講師の他の動画を見るのが効率的だと思っています。

#**Udemy英語コンテンツのメリット・デメリット**
**メリット**
・Udemyの英語コンテンツは日本語コンテンツより充実しているものが多い(独断です)
・日本語コンテンツにない技術スタックを扱っている
・最新技術の動画が出るのが明らかに日本語より早い
・副次的に英語力向上にもつながる

**デメリット**
・ネイティブじゃない訛りまくった英語を話す講師も多いため、聞きやすい英語を話す講師を探す必要あり

#**講師リスト**
・[Jonas Schmedtmann](https://www.udemy.com/user/jonasschmedtmann/)
→比較的ゆっくり話す。自分の老いを自覚し、年齢の話題に触れるのを恐れている節がある。
・[Trevor Sawler](https://www.udemy.com/use

元記事を表示

Webex の参加者を Go 言語で取得する

法政大学情報科学部 2 年の阿部哲也です。
今回は Webex の参加者を取得するスクリプトを組みました。

# やること

出席管理を自動化させたいため、webex の参加者を自動で取得するスクリプトを Go 言語で作成します。

流れとしては、mattermost からリクエストが投げられたタイミングで、作成したプログラムがリクエストを投げます。
帰ってきたレスポンスを参考にスプレットシートに反映させるという流れです。(下記参照)
今回は GO 言語で API を取得するところまで書きます。

“`
mattermost → golang → webex API → Googleスプレットシート
“`

本当は Zoom でやりたかったのですが、Zoom API が有料アカウントではないとできない & 法政大学のアカウントは有料アカウントだが API が取得できない設定になっていたため、断念して Webex にしました。

# webex API で情報を取得

大まかな流れは下記みたいな感じです。今回は現在 meeting に参加している参加者をリアルタイムで取得します。

元記事を表示

Homebrewでバージョンを指定してGoをインストールする方法

Homebrewでバージョンを指定してGoをインストールする方法をご紹介します。
まず、`Homebrew`でインストールできるGoのバージョンを確認するために下記のコマンドを実行します。

“`
% brew search “go@1″    #brew search goでも可
==> Formulae
go@1.10 go@1.12 go@1.14 go@1.16 go    gom
go@1.11 go@1.13 go@1.15 go@1.9 gor gox
“`
  

今回は` go@1.16`をインストールしたいと思います。下記コマンドを実行します。

“`
% brew install go@1.16
“`
  

指定したバージョンがインストールされていることを確認します。

“`
% go version
go version go1.16.13 darwin/amd64
“`

元記事を表示

# GoでSQLiteに接続してレコードを取得する

少し間が空きましたが、以前学習していたGoに再入門します。

手始めにデータベース接続するコードを書いてみました。データベースは気軽に使用できるSQLiteを利用しました。テスト用のレコードを作成して、それを取得してみます。

以下は全レコードになります。※貼り方が雑ですみません。

“`
テーブル名:list

id,content,finish,updated,created
1,テスト,0,2022/2/4 21:36:00,2022/2/4 21:36:00
“`

## 作成したコード

“`go
package main

import (
“database/sql”
“fmt”

_ “github.com/mattn/go-sqlite3”
)

func main() {
db, err := sql.Open(“sqlite3”, “./todolist.sqlite3”)
checkErr(err)
defer db.Close()

rows, err := db.Query(“SELECT * FROM list”)
checkEr

元記事を表示

【gRPC】GoでStreaming APIを実装する

#はじめに
前回の記事で、gRPCのAPIタイプの内、1リクエストに対して1レスポンスを返すUnaryを実装しました。
今回は1回のコネクションで複数のリクエストやレスポンスを送るタイプである、Streaming APIを実装してみました。

https://qiita.com/suzuki0430/items/c0efd9a00ba0a7d77a88

#Streaming API
Streaming APIはHTTP/2の恩恵を受けており、リクエスト/レスポンスのたびにコネクションを確立しないというメリットをもちます。
3種類のタイプがあり、それぞれが以下のような特長をもっています。

– Server Streaming: 1リクエストに対して複数レスポンスを返す。サーバが大量のデータを送りたいとき(ライブ配信やチャット)に使い、リクエストを受け取らずとも非同期でレスポンスを返す。
– Client Streaming: 複数リクエストに対して1レスポンスを返す。クライアントが大量のデータを送りたいとき(データアップロードなど)に使い、サーバは非同期でレスポンスを返すことができる

元記事を表示

M1 Mac も速くないことがある

# これは何?

先日まで Mid 2015 の 15 inch MacBook Pro (Core i7 クアッド / 2.2 GHz) を使っていた。
先日 MacBook Pro 14 inch (M1 非Max) を手に入れたんだけど、あんまり速くないなと思うことがあったので、今日も楽しいマイクロベンチマーク。

# 計算内容

ruby で書くと短くていいね。

“`ruby:ruby
N=10000
r=(1..N).max_by{ |x| ((N-x)**x/7) % 6074001001 }
p r
“`
こういう内容。なんの意味もない。

出力は

“`text
8663
“`

となれば正解。

これを、go, java, c++ with boost (clang, gcc), ruby, python3, node で試した。

以降、グラフで出てくる “m1”, “rosetta”, “amd64” の意味は下表のとおり。

|記号|実行ハードウェア|バイナリ|
|:–|:–|:–|
|m1|MacBook Pro 14 inch (M1 非Ma

元記事を表示

Raspberry pi 4 2台を使って映像配信と受信してみた。【Gstreamer +Golang (gocv)】

## はじめに
OpenCV4の入力にカメラ映像ではなく、Gstreamerからの入力を受け取り表示します。
Raspberry piのカメラユニットの映像を別PCで動かしているOpenCvで受信してみます。

今回動かすシステムの構成としてはこのようになっています。

“`
WEB camera – Raspbery pi 4(カメラ配信サーバ) ===== Raspberry pi 4(受信サーバ)
“`

Gstreamer の勉強も兼ねているので、先ずは単機で動かしてステップアップ方式で進めていきます。

記事の構成がわかりにくくてクソなのですが、「機器間配信のテスト」まではWindows10で実行しています。
それ以降はRaspberry pi4 2台を使って配信と受信を行っています。

大まかな流れは変わらないのでご容赦ください。

## Gstreamerでの配信について
配信する側もゆくゆくはソフトとして作っていきますが、今回はコマンドラインで代用します。

### Gstreamerの動作確認
インストール済みだとは思いますが、映像を配信できるかを確かめます。

元記事を表示

[Go] Structs

# Structs とは

`Go` には関連する情報をまとめするため、 `structs` が使われる

# Defining and Declaring

“`Go
package main

import “fmt”

type person struct {
firstName string
lastName string
}

func main() {
var aaa person
fmt.Println(aaa) // The default value is a empty string.
fmt.Printf(“%+v\n”, aaa) // Use the “%+v” can print the fields also.

// Updating Struct Values
aaa.firstName = “aaa”
aaa.lastName = “player”
}
“`

# Embedding Structs

`Structs` に `structs` も宣言できる

“`Go
package main

impor

元記事を表示

Go導入リンク

# Go導入リンク

新しく案件でGoを使うことになったので使えそうなドキュメントをリンクしていく
随時更新予定

追記予定:
デプロイ周り
Unity連携
gRPC-web

# Goダウンロード・インストール

**公式サイト**

https://go.dev/

**ダウンロード**

https://go.dev/dl/

**確認**

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

# エディタ

VSCodeやAtomなどにプラグイン入れる方法もあるが、すぐ始められて多機能なJET BRAINSのGoLandが一番いいと思う(有料だけどその価値はあった

https://www.jetbrains.com/ja-jp/go/

# チュートリアル

## A Tour of Go

初学者は一通りこれを見ればいい、ポインタ、Goroutineだけ理解を深めるため他のサイトも見た。

https://go-tour-jp.appspot.com/welcome/1

### メモ

以下、Go特有だった

元記事を表示

[Go] time.AddDate() で月を加算する

# はじめに

Golang の [time](https://pkg.go.dev/time) パッケージの`AddDate()`について、
挙動を理解していないが為に重要なバグを生んでしまったので、まとめてみました。

# 結論

– `AddDate()`で月を加算すると加算前の月の日数(1月だったら31日)が加算される
– つまり、2022年1月31日に`AddDate()`で月を1加算すると、2022年3月3日になる

# 実際に起こったこと

それは、今月の月と来月の月を返す関数`getMonths()`を実装した際に起こりました。

まずは、実装したコードを見てください。

“`golang
func getMonths() []int {
targetTime := time.Now()

元記事を表示

Goアウトプット #03 【関数】

# 関数

– Go言語の関数は複数の値を返すことができる
– 関数の中には名称のない匿名関数を作成することができる
– `main()`関数(エントリーポイント)
└引数、戻り値を返さない
└基本的にプロジェクトに1つで、パッケージはmainになる
– funcキーワードで開始し、関数名、引数(省略可)、戻り値(省略可)を宣言

## 基本的な関数の文法

“`go
func main() {
result := pls(10, 10)
fmt.Printf(“result=%d \n”, result)
}

func pls(x int, y int) int {
return x + y
}

// -> result=20
“`

## 多値を返す関数

– Go言語は関数の戻り値を多値で返すことができる

### 戻り値の文法(戻り値の型指定のみ)

“`go
func 関数名(引数名 型[, …..])(戻り値の型[, ….]){
処理
return 戻り値
}
“`

“`go
func main() {
add, sub

元記事を表示

【AWS】Go Lambdaのローカル開発環境を作る ( aws-sam-cli + M1mac )

# はじめに

`aws-sam-cli`を利用すれば、手元の端末内にLambdaの実行環境を再現して、動作検証できる。
手元でコードを修正しながらその場で動作確認できるため、ディプロイの手間とLambdaの費用を削減できる。
nodejsとpythonの導入手順は多い中、Golangのドキュメントが少ないように感じたため、ここで纏める。

### やること

* 開発用にarm版Golangをローカル環境にインストールする
* `aws-sam-cli`でローカル環境にLambdaとAPIGatewayを構築する

### 前提

* arm版(M1チップ)の`macOS`環境をベースに説明する (goenv導入部分以外は大差ないはず)
* Z shell (zsh) をベースに説明する (環境変数の通し方以外は大差ないはず)
* Dockerは既にインストールしてあるものとして説明する

# もくじ

1. Golangをセットアップする
* aws-sam-cliをセットアップする
* ローカル環境でLambdaを起動する

# 1. Golangをセットアップする

#

元記事を表示

GoでWordleを作った

最近流行りのWordleを真似してGoでCLIを作ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673998/2b75b6a6-899a-cc82-8f78-5c7c0cf98b1e.png)

#Wordle
Wordleとは、お題となる伏せられた5文字の単語を6回の試行の間に当てるゲームです。回答ごとに、各文字の位置が一致しているか、含まれているかいないかといった情報が色で与えられるようになっています。

https://www.powerlanguage.co.uk/wordle/

#仕様
今回は以下のような仕様で実装を行いました。

– 正解となる単語をランダムに単語帳から取得
– 単語帳に含まれる5文字の単語をユーザに入力させる
– 回答と正解を比較し、文字ごとに背景を色分けして表示する
– 正解に含まれ、位置も合っている文字は緑
– 正解に含まれる文字は黄色
– 正解に含まれない文字は赤
– アルファベット26文字それぞれの情報をリス

元記事を表示

gorilla/csrfのオリジン間APIの実装とCORSエラー

バックエンドをGoでフロントエンドをReactでアプリを作成しており、CSRF攻撃の対策のためgorilla/csrfを導入しようとしたのですが、CORS関係でエラーが頻発しました。
この記事では、Reactは使わず、goで立ち上げた仮想フロントエンドサーバーにaxiosを入れて解説します。

gorilla/csrfライブラリの公式
https://github.com/gorilla/csrf#javascript-applications

実装結果は下記の通りです。

“`sh:ファイル構成
.
├── back
│   └── main.go
├── front
│   ├── index.html
│   └── main.go
├── go.mod
└── go.sum
“`

“`go:front/main.go
package main

import (
“log”
“net/http”
“text/template”
)

func main() {
http.HandleFunc(“/”, func(w http.ResponseWriter, _

元記事を表示

OTHERカテゴリの最新記事