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

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

macOSでGo,Echo,GORM,sql-migrateを用いた環境構築を1から丁寧に解説

#自己紹介
現在都内の企業でエンジニアのインターン生としてお世話になっている大学2年生です!
これから学んだことや苦労したことを記事にしていこうと思います!
よろしくお願いします??‍♂️

#はじめに
タイトル通りmacOSでGo,Echo,GORM,sql-migrateを用いた環境構築をします!
1から丁寧に解説していくので右も左もわからない人が見ても理解して環境構築できる内容になっています!

#環境
M1MacOS ver12.0.1
Mysql ver8.0.27
SQLマイグレーションツール:sql-migrate

#Goってなに?
>Goは、Googleがサポートするオープンソースのプログラミング言語である。
>高速で信頼性が高く、効率的なソフトウェアを大規模に構築できる。

参考 [Go公式](https://go.dev/)

#echoってなに?
>高性能で拡張可能かつミニマリストのGoのWebフレームワークである。

参考 [echo公式](https://echo.labstack.com/)

#GORMってなに?
GORMとはGo言語のORMです。

#

元記事を表示

Rails+deviseに全任せしてた雑魚がGoでログイン機能をつくるまで【前編】

業務ではRails+deviseに頼りっきりの雑魚エンジニアが、GoでWebアプリ作るためログイン機能の実装に悪戦苦闘した記録です!

## 環境
OS macOS Catalina 10.15.7
Go 1.16.6
MySQL 8.0.26

## 目次
**【前編】ユーザーデータ保存**
– 【お手頃】パスワード平文保存
– パスワードの脆弱性と対策について
– パスワードの文字数を制限
– ログインに10回失敗したアカウントは30分間ロック
– 脆弱性対策後のコード全文
**【後編】セッション管理**
– セッション状態をどこに保管するか
– クッキーの概説
– 【お手頃】Cookieに平文保存
– XSS攻撃
– 【改ざんされない】JWTを使う
– 【情報がバレない】セッション用のライブラリを使う
– 再生攻撃
– CSRF攻撃
– 脆弱性対策後のコード全文

## 【前編】ユーザーデータ保存
前編では、パスワード保存のセキュリティについて考慮しながら、サインアップ画面とログイン画面を実装します。
データベースはMySQLを使います。

## 【お手頃】パスワードを平文保存

元記事を表示

Go Webアプリケーションの内部的な仕組み

こんにちは。natariです。

Golangを本当に基礎からやろうと、Goで構築したwebアプリの内部で何が行われているかを学習したので備忘録としてまとめます。

【背景】
これまでいくつかwebアプリを作ってきたが、内部的にそもそも具体的に何が行われているのかという基礎の部分があいまいだったため、改めて学習しなおそうと思った。また、これからGoでAPIサーバを作ろうと考えているので、基礎をしっかり学習しておくことで、後々理解が深まったり応用が効くと思ったため。

【本題】
①クライアントからサーバへHTTPリクエストを送信する。

②リクエストは、一旦マルチプレクサと呼ばれる部分に送られる。このマルチプレクサが、リクエストの値を見て適切なハンドラにリクエストを振り分ける。

③ハンドラは、リクエストを処理する

④ハンドラにおいてDBのデータが必要な場合、DB内部のデータをモデル化したデータ構造体を使用する。このデータ構造体がDBと接続する。

⑤ハンドラでの処理完了後、ハンドラはテンプレートエンジンを起動する。

⑥テンプレートエンジンは、テンプレートを作成し、取得したデータと合

元記事を表示

最新版Go(ver1.17.6)をインストールしてからgodocを使うようにするまでの手順

##はじめに
Goもアップデートを重ねていく中で、段々と、インストールの手順などその扱い方が変化しつつあるようです。
実際に私も、Go言語を勉強しながら、既存の情報通りに試しても、バージョンが違うことからうまくいかない〜、ということがちょいちょいありまして、今回は、
>そういえば超々最初の段階でいきなりつまづいたことがあったな〜〜〜

とふと思い出したので、それの備忘録です。

##やりたいこと
Macに[Go](https://go.dev)(ver1.17.6)をインストールしたのち、godocコマンドが使えるようにして、godocでオフラインからドキュメントを閲覧したり、Webサーバーとして起動させて、ブラウザ上での確認などしたい。

###環境
– OS: macOS Monterey バージョン12.1(10.13以降なら問題ありません)
– Go: 1.17.6 darwin/amd64

##GoDocとは
Goという言語では様々な標準ライブラリやGo製のサードパーティ製パッケージが備わっていますが、それらについてのリファレンスや、また、開発をしながらコメントやdoc

元記事を表示

Go言語に入門する

Go言語には何度か入門してその都度なんとなく挫折してきましたが、いよいよそうも言ってられない状況になってきたので本腰を入れて入門します。

参考にした本はこちらです。
[スターティングGo言語(松尾 愛賀)|翔泳社の本](https://www.shoeisha.co.jp/book/detail/9784798142418)
なおこの本ではGo1.6を対象に書かれており、そのまま動かすためには`go run`時に`GO111MODULE=off`という環境変数を定義する必要があるようでした。

# 最小限のプログラム

これが最小限のプログラムである。

“`go:hello.go
package main

import (
“fmt”
)

func main() {
fmt.Println(“Hello, World!”)
}
“`

実行方法はこちら。oオプションを指定しない場合カレントディレクトリの名前がファイル名になる。
go build時のファイル指定がなかった場合は*.goが指定された事になる。

“`shell
go build -o hello he

元記事を表示

Go の Generics に対応したライブラリを作ってみた

来月リリース予定のGo 1.18からGenericsが対応されることで、一つの関数定義で様々な型の処理を担うことができるようになります。
現在ベータ版の中でいろいろな人がいろいろな使い方を試していると思いますが、せっかくなのでこの機にGenerics対応のライブラリを作って(プレ)公開してみました。
そしてせっかくなのでちょっと宣伝ついでに、実際にGenerics環境を触ってみての感想とかを書きたいと思います。

### 注意事項

この記事は2022年1月時点での現況を元に記載しています。
2月には正式なGo1.18がリリースされることで、いくつか状況が変わっている可能性があります。

# 作ったライブラリ

https://github.com/meian/gcf

MapやFilterなど、他の言語でよくあるCollectionを操作する処理の詰め合わせです。
内部的にはIteratorな実装を合成することで、Collection ライクな処理の合成を(なるべく)簡単に行えるようにしたものです。
現状はスライスを使うかRepeat関数で同じ要素を並べるしかCollectionソー

元記事を表示

Go : 名前付き返り値がある状態で、returnのみ記述したときの挙動

* 名前付き返り値が設定されている状態だと、`return`だけ記載することができ、その場合は名前付き返り値が暗黙的に返却される。

“`go
func example()(ret string){
ret = “hello world”
return
}

func main(){
fmt.Println(example()) // hello world
}

“`

* 一方で、名前付き返り値を設定しておきながら、別の変数を返却することも可能

“`go
func example() (ret string) {
ret = “hello world”
ret2 := “goodbye world”
return ret2 //新たに定義した変数を返す
}

func main() {
fmt.Println(example()) // goodbye world
}
“`

* コンパイルエラーにならない。名前付き返り値を設定している意味がないし、予期せぬ挙動を招いてしまう可能性があるので、名前付きの方を返却するように修正するか、あるい

元記事を表示

GO言語 – unzip処理の脆弱性対策(ついでにwindows, macで作られるzipファイルのサポート)

GO言語でのunzip処理は `archive/zip` パッケージを用いれば実装可能ですが、実装をしてみればいくつかのつまづきポイントがあったため本記事に備忘録も兼ねて記しておきます。
つまづきポイントとしては

– Windowsで圧縮された日本語名のファイル対応(Shift JIS)
– macOS特有のファイル除去
– 脆弱性Zip Slipの対策 (←一番話したいこと)

などでした。

本当は上二つの記事を書くつもりでしたが、実装する内に脆弱性の勉強する機会に巡り合ったため脆弱性の話重めで書こうと思います。

参考したunzipのコード : https://golangcode.com/unzip-files-in-go/

## コード全文

“`go
package main

import (
“archive/zip”
“fmt”
“io”
“os”
“path/filepath”
“strings”
“unicode/utf8”

“golang.org/x/text/encoding/japanese”
“golang.org/x/text

元記事を表示

Goアウトプット #01

# 多重代入

“`go
var a, b, c int
a, b, c = 10, 20, 30
“`
または

“`go
a, b, c := 10, 20, 30
“`

# 同じ型の複数宣言
– 初期化した値はゼロ値と呼ばれる。
※数値の場合は0

“`go
func main() {
var (
x int = 100
y int = 300
z int
)
// zは初期化されているだけなので、0になる

fmt.Println(“x + y + z =”, x+y+z)
}

// -> 400
“`

## iota識別子
– 連続した整数型整数を表現することができる
※変数でやったらエラーでた。←定数宣言でしか使えないから、そりゃそう。

“`go
func main() {
const (
x = iota
y
z
)
fmt.Println(x, y, z)
}

// -> 0 1 2
“`
“`go
func main() {
const (
x = 1
y = iota

元記事を表示

golangのinterface

# interface がよくわからん

interface を[英和辞典][1]で調べると**境界面、接点、共通の問題**と出てくる。
[コンピューター用語辞典][1]によると

> インタフェースは,実装についての情報をもたないメソッドの集合の宣言とする.
> インタフェース及び継承をサポートするオブジェクトシステムでは,
> インタフェースは,一般に他のインタフェースから継承できる

ここからはコードを用いて go のコードを使いながら interface の理解を進める。

## interface のメソッドを満たしていれば異なる構造体でも interface に代入できる。
### 1

“`go:main.go
type Hoge interface {
FuncA()
FuncB()
}

type Foo struct {
x string
y int
z bool
}
“`

上記のコードの Hoge インターフェイスは FuncA、FuncB という関数を持った集合体 = メソッドの集合体
実装部分は Foo が担っている。
実装:

元記事を表示

【Gorm✕firestoreで構造体の大文字が変換されない対処法】

Gormからfirestoreにデータを保存する際、タグをつけなければ構造体の大文字のままキーが設定されてしまったので、対処法を記述する。

単純に、`firestore:”name”` のようなタグを構造体に付与すればいい。

“`json
type User struct {
Name string `json:”name” firestore:”name”`
Email string `json:”email” firestore:”email”`
}
“`

ドキュメントしっかり読もう。

https://pkg.go.dev/cloud.google.com/go/firestore#example-DocumentRef.Create-Struct

元記事を表示

BudouX を Go と Rust で使えるようにした

少し前に [BudouX](https://github.com/google/budoux) というライブラリが公開されました。

日本語の文章を与えると適切な改行位置を推測してくれるライブラリで、 Python と JavaScript に対応しています。

これを Go で使いたい!
と、思って移植しました。

https://github.com/sg0hsmt/budoux-go

ついでに Rust にも移植しました。

https://github.com/sg0hsmt/budoux-rs

この記事では移植したライブラリについて軽く紹介したいと思います。
(使い方とかは README を読んだほうが早いかもしれません)

## 本家 BudouX の中身

オリジナルの BudouX は次の要素で構成されています。

– 機械学習モデルを訓練するための Python スクリプト
– JSON 形式の学習済み機械学習モデル (約 10 KB)
– 機械学習モ

元記事を表示

golangでインタプリンタを作る

# 概略

今回、go 言語でインタプリンタを作ろうと思った経緯は、筆者は半年ばかり独学で python の勉強をしてきたが、よりプログラミングの理解をより深めるために自作しようと思い立った。
go 言語を選んだ理由としては、静的型付け言語を触りたかったのと、なんとなく流行っているからである。
この記事は[Go で作るインタプリンタ][1]を参考に進めていく。
本記事は、第一章を読み終えたのでこちらにまとめを書く。

# 第一章、 字句解析

## 字句解析とは

ソースコードからトークン列に変換することを「字句解析」という

“`
let x = 5 + 5;
“`

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748654/3e130d5e-ad7a-c8fb-acf7-6b854bf1a29e.png)
上記の図のように token 列を生成する

## 字句解析器

1. token の定義

“`go:token.go
type Token struct {
T

元記事を表示

【Go】APIサーバの構築 ~GraphQL編~

#はじめに
APIサーバにGraphQLを導入してみたのでメモを残します。

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

https://qiita.com/suzuki0430/items/3eacf2329e0ce85d23d7

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

コード全文は以下です。

https://github.com/suzuki0430/backend-go-movies

#GraphQL
どこにでも書いてある情報ですが、GraphQLの導入メリットには以下のようなものがあります。

– エンドポイントが1つでOK(RESTのようなエンドポイントの肥大化を防げる)
– クエリを用いて必要なデータのみを取ってくることができる(無駄な通信帯域を消費しない)
– データ型の定義がされていて、クライアント-サーバ間の食い違いを防げる

他にもGraphQL関連の記事を書いているので、もし興味があればご覧ください。

https:

元記事を表示

goroutineで並行処理のメモ

goroutineを使ったときのメモです。

### channelで待ち合わせせずgoroutineを使う場合の注意

mainのgoroutineが終了すると、他のgoroutineが走っていてもプログラムは終了してしまうので注意しよう。待ち合わせをしたい場合はchannelを使う。

“`main.go
package main

import (
“fmt”
“time”
)

func main() {
go func() {
fmt.Println(“start goroutine”)
time.Sleep(3 * time.Second)
}()

// time.Sleep(4 * time.Second)
fmt.Println(“finished”)
}

“`

上記のコードを走らせた場合は以下のようになり、goroutineがそもそも開始されていないことがわかる。

“`
$ go run main.go
finished
“`

### channelを使って待ち合わせした場合

“`main.go
package main

元記事を表示

【Go(Gin)✕Docker✕delve✕vsCodeでデバッグできるようにする最小構成】

## ディレクトリ構成

Goアプリケーションはapplicationディレクトリ以下にある。
*(アスタリスク)で囲んでいるファイルがポイント。

“`docker
.
├── .vscode
│   └── **launch.json**
├── README.md
├── application
│   ├── **Dockerfile**
│   ├── controllers
│   ├── db
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   ├── models
│   ├── server
│   ├── services
│   ├── **start.sh**
│   ├── tests
│   ├── tmp
│   └── vendor
├── **docker-compose.yml**
└── tmp
“`

## docker-compose

– 8080:8080はもともとあったアプリケーション用のport。

– 2345:2345をデバッガ用のportとして追記。

“`docker
ver

元記事を表示

GOLANDでGOプロジェクトをインストールしたら最初にやる設定

1.Go Modulesを有効にする
Go Modules=>Enable GO Modules integrationにチェック

![スクリーンショット 2022-01-15 15.03.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/dc28d063-4265-febf-d756-bf815d172d70.png)

2.ルートディレクトリにモジュール群をインストール

“`
cd paht/to/root-dir
go mod vendor
“`

これでコードジャンプも効くようになる。

元記事を表示

GolangでS3からZipダウンロードする時の中身のタイムスタンプの設定

## 概要

S3にあるファイルを一つにまとめてZipダウンロードする際の中身のファイルのタイムスタンプを引き継ぐ方法について解説する。

## zip化の流れ

1. tmpフォルダにzipファイルを配備する
1. S3から該当ファイルを複数取得する
1. 取得したファイルをZipファイルに書き込む **<- この中身のタイムスタンプの設定** 1. zipファイルをS3にアップロードする 1. tmpフォルダのzipファイルを削除し、S3へのzipパスを返却する ## 対象モジュール archive/zip ※標準パッケージ ## Goのバージョン 1.17.2 ## zip内のファイルの更新日時が1979/11/30になってしまう zip書き込みを以下のようにそのまま実施してしまうとS3に登録した更新日時が適用されずに1979/11/30になってしまう問題がある。[参考記事](https://stackoverflow.com/questions/37517620/golang-zip-package-modified-time-defaults-to-30-no

元記事を表示

[Docker]/bin/sh: /go/bin/dlv: not found

## 記事を書いた経緯

タイトル通りGoAPIのdocker-compose上で`/bin/sh: /go/bin/dlv: not found`というエラーが発生してしまったので
その解決策をメモしておきたいと思います。

## 原因
mainブランチを更新した時にDockerfileに

“`Dockerfile.dev
RUN go install github.com/go-delve/delve/cmd/dlv@latest
“`
というのか追加されました。

しかし、いつも通り

“`
$ docker-compose down
$ docker-compose up
“`
をしましたが、
![スクリーンショット 2022-01-14 13.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593744/69531747-aeb9-ca3f-a236-4488dde7633c.png)
Airが正常に動作しませんでした。

## 解決策

“`
$ docker-comp

元記事を表示

C++,C#のコメントアウトテクニック

# 概要
下記のような記載が出来る言語で使えるコメントアウトのTips

[使える言語の参照](https://qiita.com/power3812/items/d8fc76f551970085e189)

“`main.cpp
// 1行コメント
/*
複数行コメント
複数行コメント
*/
“`

# 内容
複数行コメントを1文字で切り替える
先頭の**スラッシュ(/)**を消すと切り替えれる

“`main.cpp
//*
現在の
複数行コメントは
コメントアウトされない
//*/

/*
現在の
複数行コメントは
コメントアウトされる
//*/
“`

機能の切り替えを1文字で切り替える
上記のIF版で
先頭の**スラッシュ(/)**を消すと切り替えれる

“`main.cpp
//*
Active Block
/*/
Disable Block
//*/

/*
Disable Block
/*/
Active Block
//*/
“`

# まとめ
C++er には多少有名なのでN番煎じではあるもののいろいろな言語で使えるので書いてみました。

C++では#i

元記事を表示

OTHERカテゴリの最新記事