Go関連のことを調べてみた2019年11月13日

Go関連のことを調べてみた2019年11月13日

初見でGo言語Webアプリケーションをやってみる(パラメータを受け取る編)

# はじめに
Go初心者が、初見でWebアプリケーションを作るまでの過程をつづっていきます。

[前回:初見でGo言語Webアプリケーションをやってみる(Hello World編)](https://qiita.com/yutaka_m03/items/1f2ecbca987a6222d51c)の続き
今回は、検索などでよく使う「URLパラメーター」の受け取りを実装してきます。

## 環境
macOS:Catalina
goバージョン:go1.12.9

## URLパラメーターを受け取る
`localhost:8080/hello/yutaka0m`でアクセスすると、`Hello yutaka0m`と表示し、
`localhost:8080/hello/hoge`でアクセスすると、`Hello hoge`と表示できるように、
URLパスをパラメーターとして受け取ります。

その場合、`Param`関数を利用します。

“`go:url_path.go
package main

import (
“github.com/gin-gonic/gin”
“net/http”
)

元記事を表示

GAE Standard(Go 1.12)でCloud SQL(PostgreSQL)に接続する

# GAE Standard(Go 1.12)でCloud SQL(PostgreSQL)に接続する

## 概要
GAEからCloud SQLに接続する際の情報が[公式ドキュメント](https://cloud.google.com/sql/docs/postgres/connect-app-engine?hl=ja)では、2019/11/13現在、PythonとJava、Node.jsまでしかなく、Goがどこ行った・・・?
この記事はそんなGo(1.12)でGORMを使って接続する際の情報を記載します。

## 結論
ホストに
`/cloudsql/[Cloud SQLがあるプロジェクトID]:[Cloud SQLがあるゾーン]:[Cloud SQLのインスタンス名]`
例:`/cloudsql/sampleproject:us-west1:postgresql`
を指定すればできます。それを以下で接続する。

“`golang
db, err = gorm.Open(“postgres”, fmt.Sprintf(“user=%s password=%s host=%s dbn

元記事を表示

【Golang】 開発環境設定〜HelloWorldまで

来年転職する会社でgolangを使うとのコトで、少しでも慣れておこうと勉強はじめました。

なお、私のgolangの勉強は、基本的に「[スターティングGo言語(松尾愛賀 著)](https://www.amazon.co.jp/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0Go%E8%A8%80%E8%AA%9E-CodeZine-BOOKS-%E6%9D%BE%E5%B0%BE-%E6%84%9B%E8%B3%80/dp/4798142417/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2A1R4MA4F6Q67&keywords=%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0go%E8%A8%80%E8%AA%9E&qid=1573571940&sprefix=%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%86%E3%8

元記事を表示

【解答】Go言語初心者向けハンズオン #2

※これは解答です。どうしても課題が解けない場合、ご利用ください。

# 課題1 – 基本問題

“`golang
package main

import (
“fmt”
“math/rand”
“time”
)

const (
PAA = 1
GUU = 2
CHOKI = 3
)

func main() {
COUNT := 1000000
rand.Seed(time.Now().UnixNano())

result := [3]int{}
for i := 0; i < COUNT; i++ { a := yukpiz() b := kent() switch { case a == b: result[0]++ case a == PAA && b == GUU, a == GUU && b == CHOKI, a == CHOKI && b == PAA: result[1]++ case a == PAA && b == CHOKI, a == GUU && b == PAA, a == CHOKI

元記事を表示

初見でGo言語Webアプリケーションをやってみる(Hello World編)

# はじめに
Go初心者が、初見でWebアプリケーションを作るまでの過程をつづっていきます。

## 環境
macOS:Catalina
goバージョン:go1.12.9

## Go言語のWebフレームワークは何か?
私は普段`Kotlin`を使っているので、Webフレームワークは[SpringFramework](https://spring.io/projects/spring-framework)を使用しています。

SpringFramework的な、Go言語におけるWebフレームワークのスタンダードは何なのでしょうか?

https://qiita.com/loftkun/items/1a9951d1864bebdc51e1
上記の記事を発見し、[gin](https://github.com/gin-gonic/gin)がよく使用されているようなので、そちらを使っていきたいと思います。

## ginフレームワークをいれる
前提としてGoがインストールされている必要があります。
そのうえで、ginのREADMEの通りに、インストールをします。

“`
$ go get

元記事を表示

Go Compilerのインライン化についてまとめた

## はじめに

Go は末尾再帰が最適化されない。というかあえて最適化しない、という選択を採用しているようです。

[Goで再帰使うと遅くなりますがそれが何だ](https://ymotongpoo.hatenablog.com/entry/2015/02/23/165341)

そもそも私はあまりコンパイラの気持ちになったことがなく、関数呼び出しのときにインライン展開されるということがどういうことかわかりませんでした。

本記事では以下の 2 点についてまとめてみます。

– 関数のインライン展開とはどういうことか
– インライン展開されることでどのような効果があるのか

## 関数のインライン展開とはどういうことか

### インライン展開とは

> インライン展開(インラインてんかい、英: inline expansion または 英: inlining)とは、コンパイラによる最適化手法の1つで、関数を呼び出す側に呼び出される関数のコードを展開し、関数への制御転送をしないようにする手法。これにより関数呼び出しに伴うオーバーヘッドを削減する。特に小さくて頻繁に呼ばれる関数では効

元記事を表示

Goで自分のqiita投稿記事一覧を見れるコマンドラインツールを作ってみた。

# Goで自分のqiita投稿記事一覧を見れるコマンドラインツールを作ってみた。

Go言語の勉強をしたので、Cliアプリケーションを作成してみます。
何番煎じ目か知れませんが、QiitaのAPIを叩いて自分のqiitaの投稿記事一覧を見れるコマンドラインツールを作ってみます。
これが出来た暁には、qiitaを書く意欲がもりもりと湧いてくる筈である。

## 作ったもの
“`bash
$ qi myqi
“`
と打つと、
スクリーンショット 2019-11-12 17.21.51.png
と出力されるというコマンドラインツール。

## 使用するフレームワーク

`urfave/cli`というCLIアプリケーションフレームワークを使用してみる。
urfaveの使い方は公式のDocumentが一番分かりやすかっ

元記事を表示

mongoDB公式のGoのDriverを使ってみた

## 概要
[mongoDB公式のGo用のDriver](https://github.com/mongodb/mongo-go-driver)触ったので、そのまとめ

## 環境
go 1.12.5
go.mongodb.org/mongo-driver v1.1.2
mongoDB 3.1

## 用語
[わかりやすくまとめてくれてる方がいた](https://qiita.com/yuji0602/items/c55e2cb75376fd565b4e#rdb%E3%81%A8mongodb%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%81%AE%E6%AF%94%E8%BC%83)

– table → collection
– row → document
– column → field

## 接続
公式ドキュメントの[Usage](https://github.com/mongodb/mongo-go-driver#usage)見た方が早い気がしやすが一応

“`go
import (
“contex

元記事を表示

アドベントカレンダーに向けてMarkdown に埋め込まれた Go のソースコードに gofmt をかけてくれるツールを作った

こんにちは pon です。みなさんアドベントカレンダーは参加しますか?僕も今年は Go や Rust、Elasticsearch のアドベントカレンダーに参加する予定です。

僕はQiitaの記事を書く際には手元でMarkdownファイルを作ってそこに下書きするのですが、gofmtをかけるのが正直面倒でした。もちろん、既存コードからコピペする分には良いかもしれませんが、記事向けにコードを修正したり補足を入れた時にgofmtがかかっていない状態になることがありました。

そこで来たるアドベントカレンダーに向けて Markdown に埋め込まれた Go のソースコードに gofmt をかけてくれるツールを作ったので、ツールの紹介と作り方を記事にしました。

## gofmtmd

作ったツールはこちら

aws-lambda-go/cmd/build-lambda-zipをgo get時のエラー

何をしていたか
————-

* https://qiita.com/shunp/items/52ee20278e02e29ef3e8

此方の記事を参考に、sam cliにてgolang, API gateway を試用していたところ、エラーに遭遇しました。

環境
——

* windows10 Pro

“`
>sam –version
SAM CLI, version 0.31.0
“`

詳細
——-

* https://qiita.com/shunp/items/52ee20278e02e29ef3e8#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E5%AE%9F%E8%A1%8C

ローカル実行は問題無し。API gatewayからRequestしたところ、502エラーが出ました。

[もろもろの記事][1]を見ると、`build-lambda-zip` をbuild時に実行し、zipファイルをS3へuploadすればよさそうです

元記事を表示

【Go】コーディングTips

# はじめに

Goを書いていて便利だと思ったコーディング方法を溜めていきます。

# 構造体をフィールド名付きでPrintする

ただ `fmt.Println` するとフィールド名が付かないので見づらいときに。

[The Go Playground](https://play.golang.org/p/JNYf0-ygQ1n)

“`go
fmt.Printf(“%+v\n”, data)
“`

“`
{name:山田太郎 age:23}
“`

# 長さがNの文字列を生成する

文字数制限のメソッドをユニットテストしたいときに。
「1000文字も手打ちできないよ〜」みたいなときに。
ちなみに長さは指定した分になるけど、値は空っぽ。

[The Go Playground](https://play.golang.org/p/e-J8S7HOXja)

“`go
str := string(make([]rune, 1000))
“`

# ある文字をN個生成したい

デバック中、見たいログを目立たせるときに。

[The Go Playground](https:

元記事を表示

ゲームボーイのエミュレータをGoで作った話

## 前置き

1か月ほど前にbokuwebさんの[ゲームボーイエミュレータをGo言語で書いた](https://blog.bokuweb.me/entry/gopher-boy)というブログ記事を見ました。

ゲームボーイ世代(正確にはGBC)であったのとGOで何かしたいと思っていたのもあって、僕もゲームボーイのエミュレータに取り掛かってみることにしました。

## できあがったもの

元記事を表示

golang error handling (Go1.13)

# 初めに
自分で簡単なWebサービスを作っていくにあたり、どこでどういうエラーが起こったのかわかりにくく、エラー解消に多くの時間を割くということがおきた。そのため、エラーハンドリングを学び、この問題を解消したいと考えた。

#version
go version go1.13.3

#対象読者
* エラーハンドリングって何?という人
* エラーハンドリングをやっていきたいが、何が正解かわからない人
* 一緒にエラーハンドリングについて考えてくれる方

# 躓いたところ
GolangのVersionが上がりライブラリerrorsに変更が加えられた。そのため、今までのエラーハンドリングと違うやり方になったらしい。それでは、どういう場合にどういうエラーハンドリングを採用すればいいかというところで沼にハマってしまった。
[Go1.13 ライブラリerrors](https://blog.golang.org/go1.13-errors)
# エラーハンドリングをする意義
*初めに*で書いたように、エラーハンドリングは「どこに」「何をきっかけに」「どういう」エラーが起こったのかをサーバー側で判

元記事を表示

Wireを用いたGoのDI

アプリケーション開発において、ある処理を実装するときに、複数のコンポーネントを組み合わせて実装することがよくあると思います。DIとは、ソフトウェアのデザインパターンの1つで、制御の反転を実現します。コンポーネントの作成時に依存するコンポーネントを注入する考えです。

[google/wire](https://github.com/google/wire) を用いて DI を実現する例を考えてみます。

Wire が作られた背景などは [Compile-time Dependency Injection With Go Cloud’s Wire](https://blog.golang.org/wire) が詳しいです。

## ナイーブな実装

例として、以下のような構造を持つ、ユーザのパスワードを登録するアプリケーションを考えてみます。
ユーザから、名前とパスワードをうけとって、パスワードをハッシュ化して、永続化する…というシーンを想定します。

![Wire.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.

元記事を表示

MacにDockerでGolang環境を作ってみる – vol.2 Docker起動?

今回の記事は、以下を参考に作成しました。
で、自分なりに「あれ?」って詰まったところ?を捕捉しつつ記載します。

こちらの記事にお世話になりました。
メインのやった内容はこちらなので、
並行して読んでいただけるとありがたいです。
https://qiita.com/yonaimineakio/items/0990648bbce64de7edfa

# 作業ディレクトリ作成 & ファイル配置
 今までHomeにいたので、任意の場所に移動して、ディレクトリを作ってみました。

“`
  $ mkdir go_doc
  $ cd go_doc/
“`

 ここで移動した「go_doc」ディレクトリに、以下のファイルを作成します。
 (元記事参照)
  ・main.go
  ・Dockerfile

 つまり、階層はこんな感じ。

   **任意の階層**
   **  ∟ go_doc**
**       ∟ Dockerfile**
**       ∟ main.go**

## Dockerfile って何書いてんの?
で、この状態から、以下のDocke

元記事を表示

Go言語でシンプルなgRPCサーバーを構築する

## まえがき

この記事は以下の順序で組み立てられています。

1. gRPC用のコードを自動生成する
2. APIとして呼び出される関数の実装をする
3. gRPCサーバーとして起動する
4. CLIツールを使って呼び出してみる

記事を書くために動作確認をしている環境は“Ubuntu18.04“です。
ただしMacやその他のOSでも、ツールのインストール周りを公式のドキュメントに差し替えて頂ければ動かせるかと思います。

間違いなどありましたら、コメントや編集リクエストなどを貰えると嬉しいです。

## gRPC用のコードを自動生成する

#### 1. リクエストとレスポンスの構造を定義する

まずはProtocol Buffersと呼ばれる、構造を定義する為の言語を使って、リクエストやレスポンスを定義していきます。

*“example.proto“*

“`protobuf
syntax = “proto3”;

package pb;

message HelloRequest {
int64 id = 1;
string name = 2;

元記事を表示

いろんな言語でCPUのコアを使い切ってみる

## 経緯
仲間内で「コアを使い切るプログラムをいっぱい書いてみよう」という話題が出たためノリで書いてみました。せっかくなので ~~時間がないため~~ 仕事でよく使っている `Ruby` `Elixir` `Go` の3言語で試してみました。

**マサカリ防止対応**
– 実用性、最適化などは一切考えておらず ただコアを使い切ることにフォーカス。
– そのため処理速度やsyntaxは無視
– 標準ライブラリしか使わない
– 30分で書けるレベルのものという制約で殴り書きをする

### 実行環境
image.png
**OSが古いというツッコミはダメです**

– ruby
+ 2.6.4
– Elixir
+ 1.9.4
– golang
+ 1.12.7

### テストシナリオ
1. 1〜100

元記事を表示

Go言語でPKCEのCodeVerifierからChallengeに変換する

# はじめに
業務でOAuth2のPKCEの対応(Mobile側)をすることになった。
当方はAndroidエンジニアだが、サーバサイドとの疎通がうまくいかない。
レスポンスを見る限りPKCEのCodeVerifierからChallengeに変換できていないようだ。
サーバサイドからおかしなところがあったら指摘してくれ、と言われたので与えられている情報から修正案を作ってみた。
なお、Go言語はSoftware Designの記事で少し触ってみただけで業務で使ってないので俺に聞くなというスタンス。

# PKCEとは
簡単に言えば認可コード横取りを防ぐ仕組みです。
この記事がわかりやすいと思います。
https://qiita.com/samiii/items/9574d1e237228c718cd6

# どんなことが起こっていたか
最初にコードを取得するところは問題ない。(Mobile側で作ったChallenge渡すだけなので)
実際にtokenを取得する際に *”不正なCodeVerifier”* と言われている。
ただ、Mobile側で(確認用に)使用しているCodeVerifi

元記事を表示

Goの様々な知見

# 自分がGoぶつかった課題の解答をまとめます

## #1ファイルをGCSに上げるときにぶつかった

“`go
//リクエストのファイル取得
file, handler, err := this.Ctx.Request.FormFile(“file”)
//コンテキスト作成
ctx := context.Background()
//トークン使ってクライアント作成
client, err := storage.NewClient(ctx, option.WithCredentialsFile(“/go/src/keipass-api/conf/xxx.json”))
//バケットと名前指定して
writer := client.Bucket(“xxx”).Object(“xxx.png”).NewWriter(ctx)
//保存
writer.Write(file) <-ファイルがバイナリじゃないって怒られる ``` multipart.Fileはio.Readerインターフェースを実装しているため、次のようにそのコンテンツをbytes.Bufferにコピーする。 ```go

元記事を表示

Goで作成したToDoアプリにRESTful APIを追加してみる

#
[Go x Gin x GORMでToDoアプリを作成してみる](https://qiita.com/hanadaUG/items/0fd5ddc0407c4ab55d0f)で作成したToDoアプリに追加する形で機能拡張や使用したことのない技術を試していきます。
今回はCRUDのRESTful APIを追加します。

# 開発環境
– MacBook Pro
– go version : 1.12.9

“`terminal:version
$ go version
go version go1.12.9 darwin/amd64
“`

# 事前情報
Webフレームワーク : [Gin](https://github.com/gin-gonic/gin)
ORM : [GORM](https://gorm.io/docs)
DB : sqlite3
依存関係管理ツールdep : dep

“`terminal:プロジェクト構成
├── Gopkg.lock
├── Gopkg.toml
├── README.md
├── api
│   └── v1
│  

元記事を表示

OTHERカテゴリの最新記事