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

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

Goでコマンド作成

# コマンドを配列で取得
“`go:main.go

package main

import (
“flag”
cmd “backend/commands”
)

func main() {
flag.Parse()
args := flag.Args()
fmt.Println(args)
}

“`
これでだけでコマンドの引数を取得できる。

“`bash:terminal
$ go run main.go hello world
# [hello world]
“`

# コマンドの一部分を取得
“`go:main.go

package main

import (
“flag”
cmd “backend/commands”
)

func main() {
flag.Parse()
secondArg := flag.Arg(1)
fmt.Println(secondArg)
}

“`
“`bash:terminal
$ go run main.go hello world
# world
“`
指定した場所の

元記事を表示

GoでCORSの設定

# オリジン間リソース共有
オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS) は、追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組み。
https://developer.mozilla.org/ja/docs/Web/HTTP/CORS

意外とはまったのでメモ。
今回はSPAの認証にCookieを使用。
# Access-Control-Allow
“`go:middleware.go
// セッションの確認
func CORS(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// クロスオリジン用にセット
w.Header().Set(“Access-Control-Allow-Origin”, “https://hoge.c

元記事を表示

GoのWebサービスでJSONを構造体に変換し、構造体をJsonに戻す

SPAのためにJSON APIを作成。

# JSONを変換
“`go:controller/home_controller.go
type User struct {
ID int `gorm:”AUTO_INCREMENT”json:”id”`
Name string `json:”name”`
Age int `json:”age”`
Sex string `json:”sex”`
Email string `json:”email”`
Address string `json:”address”`
Password string `json:”-“`
}

type Home struct{}

func (_ *Home) Show(w http.ResponseWriter, r *http.Request) {
var user User
// リクエストボディのJSONをデコード
err := json.NewDecoder(r.Body).Decode(&user)
if err != nil {
fmt.Pr

元記事を表示

GoのWebサービスでhtmlを返す

今回はhttpリクエストの処理をcontrollerに記述しhtmlを返す方法をメモ。

# フォルダ構成
“`
root/
 ├ routes/
 ├  └ web.go/
 ├ controller/
 │  └ home_controller.go/
 └ templates/index.html
“`
laravelのような構成で作成。

# コントローラー
“`go:controller/home_controller.go
package controller

import (
“helloworld/models”
“log”
“net/http”
)

// Home画面の構造体を作成
type Home struct {}

func (h *Home)Index(w http.ResponseWriter, r *http.Request) {
   // ここに処理を書いていく
}
“`

今回はページ毎にコントローラーを分割しRESTapiを作成したかったので、構造体Homeのメソッドを作成。別のコントローラーにはまた違う構造体のメソッドを作成し

元記事を表示

Goでリクエストのたびに認証を行う

特定のリクエストURLで毎回認証を行う。

# wrapを作成する
“`go:middleware.go
package routes

import (
“backend/modules/session”
“encoding/json”
“net/http”
)

// セッションの確認
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    // ここに処理を書く
next.ServeHTTP(w, r)
})
}

“`
こんな感じのラップを作成し、HandlerFuncを引数にとる。

# クッキーを取得し、セッションを確認
“`go:middleware.go
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Req

元記事を表示

Goで毎回のリクエスト毎にログを出力

処理の内容としては、毎回リクエストのたびに何かの処理をするというイメージ。

# muxのwrap作成
“`go:middleware.go
package routes

import (
“net/http”
“time”
)

//Logger is a middleware handler that does request logging
type Logger struct {
handler http.Handler
}
//NewLogger constructs a new Logger middleware handler
func NewLogger(handlerToWrap http.Handler) *Logger {
return &Logger{handlerToWrap}
}

“`

“`go:web.go
package routes

import (
“backend/config”
“backend/controller”
“net/http”
)

var home controller.Home

func Routes

元記事を表示

Goで静的ファイルを設置

今回Nuxt.jsを使ったSPAの作成だけではなく、初心に帰りSSGのアプリも作成。staticファイルの使い方をメモ。
# muxにハンドラーを登録
“`go:web.go
package routes

import (
“backend/config”
“backend/controller”
“net/http”
)

var home controller.Home

func Routes() http.Handler{
mux := http.NewServeMux()

// static
staticFiles := http.FileServer(http.Dir(“public”)) // publicフォルダ
uploadFiles := http.FileServer(http.Dir(“upload”)) // uploadフォルダ
mux.Handle(“/static/”, http.StripPrefix(“/static/”, staticFiles))
mux.Handle(“/media/”, http.StripPrefix

元記事を表示

Goでサーバーを立ち上げる

アプリを一通り作り終えたので、Goで学んだことをまとめる。

# サーバーの立ち上げ
“`go:main.go

package main

import (
“fmt”
“net/http”
)

func main() {
fmt.Println(“starting server…”)
server := http.Server{
Addr: “0.0.0.0:8080”, // or :8080
Handler: routes(), //
}
fmt.Print(“run server!!”)
server.ListenAndServe()
}

“`
Serverの構造体にあるHandlerフィールドは指定する必要はない。
ただし書き方が変わってくるので注意。
Addrはローカルの場合0.0.0.0:8080でも:8080でも立ち上がるが、前者はCloud Runにデプロイした場合起動してくれない。:8080の場合毎回ブラウザの権限許可みたいなのが出てくるので、ローカルは前者を指定、本番環境では後者を指定している。

# ルーティング
“`

元記事を表示

dockerコンテナで引数としてホスト上のファイルを指定する

# はじめに

こんにちは、icemint0828です。
今回はdockerコンテナで引数としてホスト上のファイルを指定する方法を紹介します。
 ※自作パッケージをdockerイメージとして公開する際にハマりました。

## 動作環境
dockerが動作する環境

## やりたいこと
ホスト上では以下のように実行していたコマンドをdockerコンテナにシングルバイナリとして持たせて実行したい時があります。
“`shell
$ imgedit reverse srcImage.png
“`

dockerコンテナ上で以下のように実行したいです。
“`dockerfile:Dockerfile
# scratchはシングルバイナリを扱うためのベースイメージです。
FROM scratch
ADD imgedit /usr/bin/imgedit
ENTRYPOINT [“imgedit”]
“`

“`shell
$ docker run ghcr.io/icemint0828/imgedit:latest reverse srcImage.png
“`

このコマ

元記事を表示

goで画像の反転処理を行う

# はじめに

こんにちは、icemint0828です。
今回は自作パッケージの紹介も兼ねて、goでの画像の反転処理の方法を紹介します。

## 動作環境
go 1.18.3

## 使用パッケージ

* icemint0828/imgedit
画像の反転処理に使用しています。
画像ファイルの拡張子の変換にも使用しています。

https://github.com/icemint0828/imgedit

## インストール

“`shell
$ go get github.com/icemint0828/imgedit@v1.5.0
“`

# 画像の反転処理

“`main.go
package main

import (
“github.com/icemint0828/imgedit”
)

func main() {
// 反転方向の指定
isHorizon := true

// FileConverter
fc, _, err := imgedit.NewFileConverter(“srcImage.png”)
if err != nil {

元記事を表示

動かして覚えるGoのWorkspaceモードの使い方

今までのモジュール管理方法はこちらをご覧ください。

https://qiita.com/Rqixy/items/b906fcb54cf162427775

# 実行環境
– M1 Macbook Air
– macOS Monterey 12.4
– Go 1.18

WindowsでもGoがちゃんとインストールされていれば大丈夫です。

# workspaceモードとは

複数のモジュールを一つのgo.workというファイルで管理し、モジュール間の行き来をスムーズにすると言うものです。

“`go.work
go 1.18

use (
./module1
./module2
)
“`

このような感じでmoduleを複数管理することができます。

## workspaceのコマンド

いくつかコマンドがあるのですが、よく使うinitとuseコマンドを紹介します。
### init

go.workファイルを初期化する時に使います。
“`terminal
% go work init
“`

initの後ろに既に作成しているモジュールを追加することができます。
“`t

元記事を表示

Go On windows

## Go vscode 拡張機能

コマンドパレットで

“`cmd
Go: Install/Update tools
“`

“`text
command go.tools.install not found
“`

“`bash
$ echo %GOPATH%
D:/opt/GoLang/1.16.15/GOPATH
$ echo %GOENV_ROOT%
D:/opt/GoLang/1.16.15/go
“`

“`bash
go install github.com/ramya-rao-a/go-outline@latest
go install github.com/cweill/gotests/gotests@latest
go install github.com/fatih/gomodifytags@latest
go install github.com/josharian/impl@latest
go install github.com/haya14busa/goplay/cmd/goplay@latest
go install honnef.co

元記事を表示

Go,postgresql-13 On Ubuntu 18.04 etc

## Firewall

“`bash
sudo ufw status
sudo timedatectl set-timezone Asia/Tokyo
“`

## goenv

[install](https://github.com/syndbg/goenv/blob/master/INSTALL.md)

“`bash
git clone https://github.com/syndbg/goenv.git ~/.goenv
echo ‘# ADD’ >> ~/.bashrc
echo ‘export GOENV_ROOT=”$HOME/.goenv”‘ >> ~/.bashrc
echo ‘export PATH=”$GOENV_ROOT/bin:$PATH”‘ >> ~/.bashrc
echo ‘eval “$(goenv init -)”‘ >> ~/.bashrc
echo ‘export PATH=”$GOROOT/bin:$PATH”‘ >> ~/.bashrc
echo ‘export PATH=”$PATH:$GOPATH/bin”‘ >> ~/.ba

元記事を表示

【Go-sqlx】INSERT、UPDATEなどでプレースフォルダを使う時に、構造体に`db:***`タグを打てばそのまま使える

[前回の記事](https://qiita.com/rikimaru-odd-person/items/4151b6c94c0f48882e9c)では、sqlxライブラリでプレースフォルダを使ったINSERTする際に、
`map[string]interface{}`
を使ってましたが、職場の人から「構造体でもできる」ということを教わりました。

今回はそのメモです。

### まずはおことわり
– 「使えればいい」レベルでの内容ですので、セキュリティやコード品質は無視しております。ご了承ください。

### 結論から
– INSERT,UPDATEに使用するための構造体を用意する。
– 構造体に`db:”カラム名”`タグを明記しておく。
– SQL側でのプレースフォルダの変数名は構造体タグ`db:”カラム名”`の「カラム名」と同じにする。
– あとは通常通りNamedしたり、NamedExecして実行する。

構造体のタグ`db:”カラム名”`はSELECT文の受け手となる構造体を定義するときに使われますが、INSERT,UPDATEのプレースフォルダにも使えることを今回

元記事を表示

【Golang】zapの使い方

# 概要
先日リリースを控えているプロジェクトがあり、リリース前にログを整備したいという話になりました。
そこでGoのライブラリであるzapを使用してみたので、使い方の備忘を残そうと思います。
これからzapを導入しようと思っている方などに参考になりますと幸いです。

# 環境
– Go v1.17
– go.uber.org/zap v1.16.0
– google.golang.org/grpc v1.36.0

# はじめに
とにかくzapを使って簡単なロギングをしてみます。サーバーを立てつつzapからlogを出力してみました。

“`golang
func main() {
logger, _ := zap.NewDevelopment()
logger.Info(“Hello zap”)

conn, err := repository.InitDBConnection(“qiita”)
if err != nil {
log.Fatalf(“db connection failed: %v”, err)
}

s := grpc.NewServer()

元記事を表示

【Golang】Sentryの実装と並列実行対応

# 概要
弊社ではエラー監視としてsentryを使用しています。
golangでsentryを実装していく中で、詰まった箇所がなどがあったので備忘として残しておきます。
sentryの導入などを考えている方、カスタマイズやスレッドセーフな実装をしたい方に参考になればと思います。

# 前提環境
– Go v1.17
– github.com/getsentry/sentry-go v0.11.0

# はじめに
まずはとくにかくgolangのサーバーの中のエラーを発生させて、sentryに通知させてみます。
サーバー起動の記述は省略して、sentryへの通知の記述だけ記載します。

sentry.go
`scope.SetLevel(sentry.LevelError)`でsentryのログレベルを設定、
`sentry.CaptureException(err)`でsentryにエラー内容を送信しています。
“`golang
func PushSentry(err error) {
sentry.ConfigureScope(func(scope *sentry.Scope) {

元記事を表示

SwitchbotをLINE BOTから操作してみた(Lambda,API Gateway,Go)

# はじめに

自宅を完全スマートホーム化してみたい!!ということで第一弾はSwitchBotの加湿器を買ってみました。

じゃじゃん!
IMG_4786.jpg

今回はこの加湿器をLINE上からON/OFFできるようにしてみます。

# 構成

![kousei.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610254/eb50aeb1-4ed9-4834-f3b1-6b21d7953ad7.png)

# 準備
## LINEアカウント

https://developers.line.biz/ja/docs/messaging-api/getting-started/
を参考にチャネルを作成します。

![スクリー

元記事を表示

Golangで認証ページを突破する

# きっかけ
 Golangを今年の2月始めて触ってみて、書きやすい言語だなと思って何かGolangを使って遊んで見ようと思いました。そこで、簡単にブラウザをGolangによって操作させて、自動でログインできるような機能を作ってみようと思いました。

# 何をしたのか
 今回は、私が普段大学で利用しているLMS(学習管理システム)を使いたいと思います。
 LMSはもちろんのことログインをするためにはユーザー名とパスワードを入力しなければなりません。これを Golangを使うことでログイン認証を自動化させてみようと思います。

# 下準備
 これらを実現させるために主に2つのフレームワークを使いました。
 一つ目が[agouti](https://qiita.com/k-penguin-sato/items/deaeab18aa416496e273)です。簡単に言うとブラウザ操作を自動化させるためのフレームワークです。
 まずは下準備としてこれを`go get`によってインストールしましょう。
“`
go mod init asobi //go.modファイル生成
go get

元記事を表示

動かして覚えるGoのモジュールの使い方

色々な記事見ていたんだけど難しく感じたり英語で書いてあって分かりにくかったので、具体的な説明は特になく、こんな感じに動くんだよ。と体感的に理解してもらいたく書きました。

自分としてもまだ知識不足なところあるから、もし間違っていたら教えてくれると嬉しいです。

::: note
今回は1.18から追加されたworkspaceモードではなく、今までのモジュール管理をどうやっていたか動かしながら説明していきます。

workspaceモードはこちらから試せます!↓
[動かして覚えるGoのWorkspaceモードの使い方](https://qiita.com/Rqixy/items/6bdead71dc02eb233376)
:::

# 実行環境
– M1 Macbook Air
– macOS Monterey 12.4
– Go 1.18

WindowsでもGoがちゃんとインストールされていれば大丈夫です。

# 使い方
例えば、このようなディレクトリ構造があります。
“`terminal
% tree
.
├── main
│   └── main.go
└── module

元記事を表示

Goのcobraで作るコマンドラインツール(Hello World)

## はじめに

Goでコマンドラインツールを作るフレームワーク[spf13/cobra](https://github.com/spf13/cobra)を使うと簡単にコマンドを実装することができるので、ハンズオン形式で紹介します。

今回は以下のような、表示させたい名前をコマンドライン引数で指定すると、
`Hello <引数で指定した名前>!!!`と出力するHello World的なコマンドを実装していきます。

“`shell:Usage
> go run main.go -h
greet is a simple command line tool that greets you in English.

Usage:
greet [flags]

Flags:
-h, –help help for greet
-t, –toggle Help message for toggle
“`

“`shell:引数を指定
> go run main.go 田中太郎
Hello 田中太郎!!!
“`

“`shell:引数の指定なし
> go run

元記事を表示

OTHERカテゴリの最新記事