Go関連のことを調べてみた2020年09月30日

Go関連のことを調べてみた2020年09月30日

【Go言語】mux + cors + alice でサーバーを作成する時に注意すること。特にCORS周りでハマったことについて。

## はじめに

[gorilla/mux](https://github.com/gorilla/mux)、[rs/cors](https://github.com/rs/cors)、[justinas/alice](https://github.com/justinas/alice)を組み合わせてサーバーを作る方法を紹介します。特に、パスによって適用するミドルウェアを分けようとした時に、CORSでハマったので、そこに関わる部分を重点的に説明します。掲載するコード中では、基本的にエラーを無視する書き方なので、適宜書き換えてください。また、コード中の `…` は単純に省略を意味し、文法的な意味はありませんのでコピペする際は注意してください。

## tl;dr

プリフライトリクエストの `OPTIONS` メソッドに気をつけましょう。

## mux、cors、aliceの簡単な概要

いくつかの例を示しますが、それぞれのREADMEに書かれているような基本的な内容ですので、分かっている方は[実装本題](#実装本題)まで飛ばしてください。

### gorilla/mux

mu

元記事を表示

【Golang】Go言語 channel(チャネル)について

##channelとは?

Goroutineは並行実行されているので、通常だとデータのやりとりができません。
しかし、channelというのををつかうとデータのやりとりができます。

トンネルをつなぐようなイメージです!

“`golang

package main

import (
“fmt”
)

func goroutine1(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
    //チャネルにデータを送信
c <- sum } func main() { s := []int{1, 2, 3, 4} c := make(chan int) go goroutine1(s, c) //送られてきたデータを受信 p := <-c fmt.Println(p) // => 10
}
“`

c <- sum でcに値を送信し、p := <-c で受信しています。ここでは受信するまでブロッキングされていて、pはsumを受信するまで待っている状態です。syn

元記事を表示

【Go】基本文法③ ポインタ

udemy講座の「ポインタ」編を見終わったので、まとめとふりかえり。

今回もコンソール上に出力しながら基本的な動作を学習しました。

##前提
・udemyで[現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発)](https://www.udemy.com/course/go-fintech/)を視聴してGoを学習中
 ※「ブログ等で数行のコードの紹介は可能」とのことなので、講義で扱ったコードを引用しています。

・開発環境はVSCode + プラグイン(Goのバージョンは1.15)
・OSはWindows
・普段はJavaを使用しています。

##ポインタ
・ポインタ型の変数を指定すると、メモリの中身を直接上書きできる。
・理解しにくい場合は、「&」「*」をつけて適当に動かしつつ理解すると良い。
・ポインタ型の生成時は、”make”ではなく”new”を使用する。

“`go:

func one(x int) {
// main関数からは値だけを受け取る
fmt.Println(&x)
x = 1
}

fun

元記事を表示

Go/GinでHTTPSサーバにする方法

Go/GinでHTTPSサーバにする方法をGinのGithubから見つけたので、
メモ代わりに記載しておきます。

[環境]
go version go1.15.2 darwin/amd64

[参考URL]
https://github.com/gin-gonic/gin
README.md

###HTTPサーバの場合

“`httpd.go
r := gin.Default()
r.GET(“/”, func(c *gin.Context) {
c.String(200, “Hello Gin!!”)
})
r.Run()
“`

###HTTPSサーバの場合
“`httpd.go
r := gin.Default()
r.GET(“/”, func(c *gin.Context) {
c.String(200, “Hello Gin!!”)
})
r.RunTLS(“:8080”, “./testdata/server.pem”, “./testdata/server.key”)
“`

上記のように、
「r.Run」を「r.RunTLS」に変更すれ

元記事を表示

Excelize 2.3.1 がリリース–スプレッドシート(Excel)ファイル用の Go ライブラリ、パスワードで保護されたスプレッドシートの読み取りをサポート

github.com/360EntSecGroup-Skylar/excelize

[Excelize](https://github.com/xuri/excelize) は、ECMA-376 Office OpenXML 標準に基づいて Office Excel ドキュメントを操作するための Go 言語で書かれたクラスライブラリです。 XLSX ファイルの読み書きに使用できます。Excelize は、他のオープンソースライブラリと比較して、イメージ(テーブル)付きのドキュメントの作成、Excel へのイメージの挿入、および保存後のチャートスタイルの保存をサポートしており、さまざまなレポートシステムに適用できます。

場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新しい Excel ドキュメントの作成、既存のドキュメント(テンプレート)に基づく新しい Excel

元記事を表示

Googleマップで宝探し!たんけんぼくのかそうまちゲーム

前々から温めてたのに実装方法が思いつかなかったんだけど、ようやくプロト出来た!

# まえせつ

 **自分の住んでいる町を迷路とかゲームのマップ**として簡単に使えたら、遊び方が広がらないかなって思ってて*OpenStreetMap→Blender*変換とかやってたけどうまくいかなくって。

 で、とある日、ぼーっとGoogleマップ見てたら

“`
https://www.google.co.jp/maps/@35.6608375,139.7008749,3a,75y,43.91h,92.5t/data=!3m6!1e1!3m4!1sDrFpHa0VreQbapnpTC-QgA!2e0!7i16384!8i8192
“`

あれ・・?この**URLの”@”の後って緯度経度**・・・?

### !!!!!!!!

こっからの実装へのブレークスルーは実に早かった。

# つくってみたわ

### 宝探しを通じて現実の町探検を仮想で楽しむゲームです。

![goToMap4.gif](https://qiita-image-store.s3.ap-northeast-1.amaz

元記事を表示

Goの環境変数を扱う(viper)

# はじめに
golangで環境設定ファイルを簡単にするライブラリとしてviperというものがあります。
今回はそのviperの使い方を簡単に紹介します

# viper
シンプルにviperを使ってみる
今回は構造体にマッピングしてそれを引き回して使うように実装を行います

“` :ソースツリー
.
├── config
│ ├── config.yaml
│ └── definition.go
└── main.go
“`

“`yaml:config.yaml
# 環境変数設定用のyamlファイル
user:
name: “kosuke”
“`
本来はデータベースのユーザー名等を入れることが多いですが、今回は簡単に上記のような環境変数を設定します。

“`go:definition.go
package config

import (
“fmt”

“github.com/spf13/viper”
)

// マッピング用の構造体
type Config struct {
User User `yaml:user`
}

type User

元記事を表示

AtCoder Chokudai Contest 005 参戦記

# AtCoder Chokudai Contest 005 参戦記

参加しなくていいかなあと思いつつ、結局参加してしまうやつ.

結果は49,656,737点で、AC 528人中240位でした. 最終コードは以下で Go 言語で提出しました.

“`go
package main

import (
“bufio”
“fmt”
“math”
“os”
“strconv”
)

func min(x, y int) int {
if x < y { return x } return y } func fill(d [][]byte, i, j int, x, y byte) { q := [][2]int{{i, j}} for len(q) != 0 { m, n := q[0][0], q[0][1] q = q[1:] d[m][n] = x if m > 0 {
if d[m-1][n] == y {
q = append(q, [2]int{m – 1, n})
}
}
if m < N-1 {

元記事を表示

【Go】基本文法② ステートメント

udemy講座の「ステートメント」編を見終わったので、まとめとふりかえり。

今回もコンソール上に出力しながら基本的な動作を学習しました。

##前提
・udemyで[現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発)](https://www.udemy.com/course/go-fintech/)を視聴してGoを学習中
 ※「ブログ等で数行のコードの紹介は可能」とのことなので、講義で扱ったコードを引用しています。

・開発環境はVSCode + プラグイン(Goのバージョンは1.15)
・OSはWindows
・普段はJavaを使用しています。

##if文・switch文
・書き方はjavaと似ている。
・if文で条件文に括弧をつけるとエラーになる。
 (癖で括弧を記述しても、VSCodeが自動で括弧を取り除いてくれます。)

##for文
・for文もjavaと同じ書き方でOK。
・”range”を使用するとより簡単に記述できる。
・”range”はmapでも使用可能。

講座で出題された演習問題の自分の回答と解答例を比

元記事を表示

gRPCで使う.protoファイルの書き方まとめ

– gRPCでは、Protocol Buffersのフォーマットでシリアライズしてデータのやり取りを行う。
– `.proto`ファイルにてスキーマ定義を行い、ツールを使ってコード生成ができる。そのため、クライアント・サーバーそれぞれでこの.protoファイルを共有できれば、仕様のズレなく開発をすすめることが可能。
– この記事では、.protoファイルの文法をざっとまとめてみる

## サンプル全体
– [GitHub](https://github.com/captain-blue210/starting-gRPC/blob/main/proto/sample.proto)

“`proto
// バージョン定義
syntax = “proto3”;

// パッケージ定義
package sample;

// import
import “google/protobuf/timestamp.proto”;
import “google/protobuf/duration.proto”;

// サービスとRPCメソッド定義
service SampleService {

元記事を表示

【Golang】Go言語基礎 Goroutineとは?

本日はgoroutineについて勉強しましたのでここでアウトプットさせて頂きます!
##Goroutineとは?
Goroutineとはgoステートメントで関数を指定することで、並行実行されるものです!

まずは普通の関数を書いてみます。

“`go

package main

import (
“fmt”
“time”
)

func goroutine(s string) {
for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func hoge(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { goroutine("world") hoge("hello") } ``` ``` 実行結果 world world world world world hello hello hel

元記事を表示

Golang + Gin + Dockerのホットリロード、VSCodeデバッグ環境の構築

# 概要
Go言語のフレームワークGinの開発環境の構築。(ホットリロード、VSCodeデバッグ対応)

今回のコードはGitHubに公開してあります。
https://github.com/yolo-lin/go-demo

# 環境
– MacOS 10.15.6
– go version go1.15.2 darwin/amd64

# 導入するパッケージ
[Gin](https://github.com/gin-gonic/gin):Goのフレームワーク
[cosmtrek/air](https://github.com/cosmtrek/air):ホットリロード
[delve](https://github.com/go-delve/delve):デバッグ

# 事前準備
– Goのインストール:[公式](https://golang.org/)からインストール
– Go Modulesで依存関係を管理するため、環境変数GO111MODULEをonにする

“`bash:.zshrc
export GO111MODULE=on
“`

– Go Modulesの初期化

元記事を表示

【Go】基本文法① 定義

udemy講座の「定義」編を見終わったので、まとめとふりかえり。

基本的な動作をコンソール上に出力しながら学習しました。

##前提
– udemyで[現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発](https://www.udemy.com/course/go-fintech/))を視聴してGoを学習中

 ※「ブログ等で数行のコードの紹介は可能」とのことなので、講義で扱ったコードを引用します。

– 開発環境はVSCode + プラグイン(Goのバージョンは1.15)
– OSはWindows

##ライブラリ
・goサイトの”document”か、コマンドプロンプトで説明が読める。
・関数外でimportして使用する。

##変数
・宣言した変数が使用されていないとコンパイルエラーになる。
・まとめて宣言することも可能 ↓

“`
var (
a int
b float64
c string
d bool
)
“`
・関数の中では、型を指定しなくても宣言できる。(自動で型を判定してくれる。)

元記事を表示

TinyGoの開発環境をVSCode向けにセットアップする

TinyGoのVSCode向け開発環境セットアップがちょっと面倒だったので書き残し。
公式の記事は[ここ](https://tinygo.org/ide-integration/)。
TinyGoのインストール・セットアップは他記事をご参照ください。
筆者の環境 : MacBook Air (Retina, 13-inch, 2020) macOS Catalina 10.15.5

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335219/4049cd45-96b1-fe1c-be91-1d644156d27a.png)

## 2020/09/27 追記1
“.vscode/settings.json“ は下記TinyGo拡張機能のインストール・セットアップを行えば自動的に生成されるとのご指摘をいただきました。
なので以下“settings.jsonの作成“ パートはスキップしてしまって構いません。

## ~~TinyGoの設定確認~~
~~TinyGoでは本家Goとは

元記事を表示

golang pointer

“`p.go
type Vertex struct {
X, Y int
}

var p *Vertex
p = &Vertex{1, 2}

“`

元記事を表示

GO/Gin gin-swagger使用してAPI仕様書を生成します

# 前書

この記事は `gin-swagger`ライブラリ使用してGinプロダクトにAPI仕様書生成するための知見をまとめるものになります。
[gin-swaggerリポジトリリンク](https://github.com/swaggo/gin-swagger)
![swagger-banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/462bd1f0-1756-44a5-7363-f88e6553281c.png)

# テスト用のプロダクトを作成
フォルダを作成

“`
// 任意のディレクトリで
$ mkdir use_swagger && cd use_swagger
“`
go modを初期化

“`
$ go mod init use_swagger
“`

# ライブラリインストール

“`
$ go get -u github.com/gin-gonic/gin
$ go get -u github.com/swaggo/swag/cmd/swag
$

元記事を表示

【Golang】Go言語の基礎 値レシーバーとポインタレシーバーについて

今回はGo言語の値レシーバーとポインタレシーバーについてやっていきます!
この記事の後に、[こちらの記事](https://qiita.com/Kiyo_Karl2/items/752c3619240a293a7c0a)まで読んでいただくとよりGo言語に関する理解が深まると思います!

#値レシーバーとは
“`go

package main

import “fmt”

type Vertex struct {
X, Y int
}

func (v Vertex) Area() int {
return v.X * v.Y
}

//値レシーバー
func (v Vertex) Scale(i int) {
v.X = v.X * i
v.Y = v.Y * i
}

func main() {
v := Vertex{3, 4}
v.Scale(10)
fmt.Println(v.Area()) // => 12
}
“`
こちらは値レシーバになります。
めっちゃ乱暴にいうと*がなければ値レシーバーになります。値渡しとか言われるようです。

v.Scale(10

元記事を表示

ACL Beginner Contest のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/abl

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var k int
fmt.Scanf(“%d”, &k)

var s string = “”
for i := 0; i

元記事を表示

ACL Beginner Contest 参戦記

# ACL Beginner Contest 参戦記

## [ABLA – Repeat ACL](https://atcoder.jp/contests/abl/tasks/abl_a)

1分で突破. 書くだけ.

“`python
K = int(input())

print(‘ACL’ * K)
“`

## [ABLB – Integer Preference](https://atcoder.jp/contests/abl/tasks/abl_b)

2分半で突破、WA1 orz. A < B < C < D のパターンを見落とした. ```python A, B, C, D = map(int, input().split()) if A <= C <= B or A <= D <= B or C <= A <= D or C <= B <= D: print('Yes') else: print('No') ``` ## [ABLC - Connect Cities](https://atcoder.jp/contests/abl/task

元記事を表示

cgoのg++用インクルードパス

分かってしまったらなんてことはないが、調べてもなかなか出てこなくて詰まったのでメモ。

環境:go version go1.15.2 linux/amd64

CGOでインクルードパスを指定するときには
“`// #cgo CFLAGS: -I<インクルードパス>“`
とすればよいが、これはgccでのコンパイルのときにしか使用されない。
cppファイルはg++でコンパイルされるので、この時のインクルードパスを指定したければ
“`// #cgo CPPFLAGS: -I<インクルードパス>“`
とする。以上。

元記事を表示

OTHERカテゴリの最新記事