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

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

Go2 contracts proposalが大幅更新された (12/15)

いわゆるGo2 proposalsのひとつ、contractsが以下で提案されています。
https://go-review.googlesource.com/c/go/+/187317

さる12月15日、このproposalに大きな変更が加わったのでこれをまとめてみました。自分用に翻訳したものなので、おぼつかないところはご容赦ください。

## READMEの翻訳
### ステータス

このCLが最後に更新されてから、大きな進展がありました。
いくつかの例外(下記参照)を除き、contractsの提案のほとんどの側面は、少なくともいくつかのテスト(但し、バグはあるだろう)で実装されています。それぞれのファイルに記載されている少数の既知の問題を除き、go/typesはtestdataとexamplesディレクトリにあるすべての*.go2テストファイルをタイプチェックできるようになりました。

### 代替表記
contractsに対する代替表記を試すために、この実装ではコントラクトの代わりに(パラメータ化される可能性がある)インタフェースを使用できます。具体的には、次の表記が許可され

元記事を表示

nilがnilじゃないのでerrorになるのを静的解析で検出する

[Goアドベントカレンダーその2](https://qiita.com/advent-calendar/2019/go2)の穴埋めです。

## TL; DR
作りました: https://github.com/makiuchi-d/ptrtoerr

## なぜ必要なのか

まずは次のコードを実行してみてください。

https://play.golang.org/p/j4ffNK4Xx84

“`go:example.go
package main

import “fmt”

type MyErr struct{}

func (*MyErr) Error() string {
return “MyErr”
}

func F1() *MyErr {
return nil
}

func F2() error {
return F1()
}

func main() {
err := F2()
if err != nil {
fmt.Println(“Error!”)
}
}
“`

`F1()`がnilを返しているので`F2()`もnilを返すのですが、返っ

元記事を表示

protoc-gen-lint 以外の Protocol Buffer の Linter を紹介する

Protocol Buffer や gRPC についての記事やスライドを読むと、lint ツールの紹介として **protoc-gen-lint** がよく取り上げられているのを見る。

このツールはかなり前からあるし、protoc のプラグインとして提供されていて使いやすいということもあって未だに人気があると感じる。
ただし、これは少し前の Google スタイルガイドを参考にしているためサポートしているルールが少ないのと、バグ(に近い)修正が放置されていることからも開発はあまり活発であるとはいえない。

現在では、Protocol Buffer の Linter は他にもあり、より多くのリントルール、カスタムリントルールのプラグインサポート、コメントによるリント無効化制御、互換性チェック機能、protoc 依存の排除、Google API Standard 準拠のチェック、Vim/Jetbrain/VSCode エディター統合などを備えた、より開発も活発なツールがいくつかある。
あまり、それらのツールについての紹介を見ないので、protoc-gen-lint と合わせて比較できるよ

元記事を表示

gRPCの事始め【まずはGoから】

モバイルエンジニアとして、CBcloudに参画したbigbackboomです。メインでAndroidアプリの開発を行なっています。今回Adventカレンダー三度目の投稿です!!!

さてさて、また会社で使ってない**Go**かよと自分でも思いますが、これには訳があるんです。そもそも、これからの戦略を考えて、**gRPC**を使えるようになろうと思っていた次第なのですが、問題が・・・

**通信ってサーバーとクライアント両方ないと成り立たないんですよね・・・**

当然といえば、当然ですが、両方ないとお勉強もできないので、まずは私が好きな言語でサーバーから作っちゃおと言う感じですね。

## gRPCとは?

[![Image from Gyazo](https://i.gyazo.com/6593c9ab757b0af34291d1d2d5f5edb0.png)](https://gyazo.com/6593c9ab757b0af34291d1d2d5f5edb0)

**g**RPC **R**emote **P**rocedure **C**all とはGoogleが開発したRPC

元記事を表示

【Go言語】無駄にマルチスレッドな行数カウンタを作ってみる

# はじめに

普段から無駄なものを生成する癖が抜けません。
今回は無駄にマルチスレッド化した行数カウンタのコードを記事にしました。

ファイルによってはwc -lよりも高速なので、最速で行数を数えたい人の役には立つかもしれません。

Goは独学で勉強しています。誤りや、もっと良い書き方などご指摘をお待ちしています。

# 参考書

「[Go言語による平行処理](https://www.oreilly.co.jp/books/9784873118468/)」(なんでもっと早く読まなかったのか、、、)
[io.Readerをこすれ](https://qiita.com/ktnyt/items/8ede94469ba8b1399b12)(Goの隠れた?すばらしさを教えていただきました)

# 実装する機能

引数で指定したファイルの行数を数えて画面表示します

引数では次の値を指定可能とします
・ファイル名(-f)
・分割読込の分割数(-s)
・並列処理のためのスレッド数(-t)
・読込バッファのサイズ(-b)

# 特徴

・goroutineとチャンネルを使ったマルチスレッド処理で行数

元記事を表示

Development Environment for AWS Lambda and Go

When it comes to developing serverless applications, we have many options in terms of the workflow we can adopt in the process, as well as the tools to support it.

Today, I will present a sample development environment for a very simple API developed in Golang for the AWS Lambda.

# Requirements

* python (both Python 2.x and 3.x supported)
* pip
* Docker
* Node
* Golang 1.x

# Localstack

Having our requirements in place, let’s first install and start [LocalStack](https://github.com/localstack

元記事を表示

Goの基本の学習

Go言語の学習のための基本的な操作の備忘録です。

バージョンの確認:

“`sh
$ go version
go version go1.13.4 darwin/amd64
“`

FizzBuzzプログラム:

仕様:
・3で割り切れる数値を引数に渡すと、”Fizz”を返す。
・5で割り切れる数値を引数に渡すと、”Buzz”を返す。
・15で割り切れる数値を引数に渡すと、’Fizz Buzz”を返す。
・それ以外の数値はその数値を文字列に変えて返す。

“`go
package main

import “fmt”

func main() {
for i := 1; i <= 100; i++ { if i%3 == 0 && i%5 == 0 { fmt.Println("FizzBuzz") } else if i%3 == 0 { fmt.Println("Fizz") } else if i%5 == 0 { fmt.Println("Buzz") } else { fmt.Println(i) } } } ```

元記事を表示

遅い処理をAWS Lambdaで改善できるか検証した話

# はじめに

**これは [Media Do Advent Calendar 2019](https://qiita.com/advent-calendar/2019/mediado) の17日目の記事です。**

こんにちは、株式会社メディアドゥに入社して4ヶ月ほど経ちました、[ogady](https://twitter.com/gadyma)です。

突然ですが、電子書籍はEPUBというファイル形式であることが一般的です。
(EPUBって何?という方は、[弊社のエンジニアブログ](https://techdo.mediado.jp/entry/2019/04/01/112244)で触れていますのでご参照ください。)

現行のシステムでは、EPUBファイルを登録するときにちゃんとした形式になっているかをチェックする処理があります。オンプレミス環境で動いているのですが、この処理が100ファイルで大体15分ほどかかります。
チェック処理をシリアルに実行しているためファイル数が増えれば増えるほど時間がかかってしまっているっぽい。

今回はEPUBチェック機能だけを切り出してLambda

元記事を表示

とりあえず書き始めるGolangハンズオン

最近ちょっとGolangを入門しました。

アウトプットも兼ねて、ひとまず深いところは置いといて、
これが分かれば「書き始められる」を目標に作成してみました。
サンプルコードを並べただけだったりしますが、参考になればと思います。

「書き始められる」の具体的な内容としては、
「[AtCoder過去問精選10問](https://atcoder.jp/contests/abs/tasks)などを**調べながら**取り組める」です。

#環境構築
環境構築については、以前書いた記事があるので、そちらを参照してください。
[Golang環境構築手順メモ](https://qiita.com/shiro01/items/5c2bf4313f68aad41a14)

環境構築が面倒な場合はオンラインで実行できる環境が公式で提供されています。(標準入力はできないっぽい?)
[The Go Playground](https://play.golang.org/)

AtCoderでもコードのテスト実行ができます。(要ログイン)
[AtCoder Beginners Selection – コードテ

元記事を表示

Qiitaの情報をフル活用しながら初めてGoで簡単なAPI実装した過程を記す

この記事は[Go Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go) 16日目の記事になります

実務で初めてGoを使うことに決めました。

Go自体は全3回のチュートリアル数年前に受け(当時はGoLandがまだ無料で使えた)、
それ以来全く触っていませんでした。
`スライス` が大事と教わった気がします。

Goの仕様を思い出しながら実装していきます。
何かしらの情報を取得するAPIを実装しながら、思ったことを書いていこうと思います。

やりたい箇所はこんな感じ

– 開発環境構築
– ルーティング設定
– GETリクエストを受信
– ORMでDB接続(MySQL)、データ取得
– jsonでレスポンスを返す

# 「Go API」で検索

さて、「Go API」でとりあえずQiita検索

最初にこちらがヒットしました。
[Go のAPI開発](https://qiita.com/gonza_kato_atsushi/items/dce685a9470e5b9f52b3)
なるほど、ORMやAPIフレー

元記事を表示

Goで競技プログラミングするときのテクニック

これは[品川 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/shinagawa)の17日目の記事です。

私は競技プログラミングにGo言語で参加することが多いのですが、その際に役立つ(かもしれない)小ネタをいくつか紹介したいと思います。

なお、本記事では次のような方を読者として想定しており、競技プログラミングそのもにについては解説しません。

* 競技プログラミングにGoで参加しはじめた人
* 競技プログラミングに興味があってGoで参加したいと思っている人

競技プログラミングそのものについて知りたい場合は drken さんの [AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~](https://qiita.com/drken/items/fd4e5e3630d0f5859067) を見ると雰囲気がわかると思います。

## 0. C++での参戦を検討する

Goで競プロをやるのは C++ 利用と比較すると結構マゾいので、これから始める人はまずC++で参戦できな

元記事を表示

GoでのAPIを引っ張ってくるやり方

# はじめに
Slackbotでの天気予報をお知らせするbotを作成しました。以下、コード。

**[天気予報Bot](https://github.com/shxn6934/Weather_Bot)**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179470/19b2123b-f469-27f8-cfd3-bcc9026f5fa7.png)

このbot作成時につまづいた、GoでのAPIをここに記します。
※botに関しての記事ではないので、注意。

## API
今回使用した天気予報を持ってくるAPIは、[OpenWeatherAPI](https://openweathermap.org/api)です。

また、Slackbotを作成したため、もしよければ[Slackapi](https://api.slack.com/)を使用してbotを作成してください。

登録方法は、以下のサイト参考。
[無料天気予報APIのOpenWeatherMapを使ってみる](https://

元記事を表示

[勉強用](随時更新)Vueを勉強しようとおもったら久々にWebにてお出すことになった話(応援歓迎)

開発に合わせたGithubはこちら
https://github.com/KeiMae/vue-study

# 何をやってみようかと
普段データサイエンスをしていているだけど、簡単なレポートはBIツールではなくWebでも見せられるようにしてみようかなぁと思い立って。
データサイエンスらしく普段はpythonしか描かないのですが、さすがにモノスキルは良くないと思い、Golangに~~いまさら~~着手しようと。
詳しいコンテンツはPageTopのgithubを見てください

## さて
普通のpythonだと、インフラは大体こんな感じじゃないかと

– パッケージマネージャ
– pyenv
– 仮想環境
– virualenv

サイエンスならcondaなのでしょうけど。
確かにこれでパッケージのバージョン管理とかもできるし、(今回はやらないけど)検証・本番環境へのリリースもある程度簡単にできる。しかし、いま(2019年)はコンテナ全盛期。 ちょっとコンテナ開発を試みます。

# 自分の思うコンテナ
きっと仮想環境を作ってくれる、、、つまり、ミドル層でのバージョン管理なんかは扶養。

元記事を表示

Golangにおけるポインタについて

## ポインタって?
まず、ポインタという言葉の前にメモリについて理解をすることが必要です。

“` go

n := 200

“`

変数nが定義された時に、200を一時的に保存する場所が ` メモリ`です。

メモリは、複数存在しそれぞれのメモリに番号が振られています。

この番号を `アドレス` と呼びます。

実際にアドレスを確認してみます。
Goでは、&を定義した変数の前につけることでメモリを確認することができます。

“` go

func main() {
n := 200
fmt.Println(&n)
// -> 0xc000084000

“`

つまり、アドレス`0xc000084000`に変数nの200が保存されていることになります。

アドレスとメモリについて理解したところで、` ポインタ `について考えていきます。

ポインタを調べると、このようにまとめらていました。

* メモリのアドレス情報のこと
* アドレス情報を格納するための変数のこと

もう少しこの2つを詳細に見ていきます。

Golangには、 `ポインタ型`と`ポインタ

元記事を表示

Go langでfwを使わずにcrudのappを作成しました 3

#jqueryでput methodを実装

htmlでformを使ったり、deleteを使うときには、http methodを使いますが、htmlのformにはgetとpostしかないみたいなんですね〜。putなどは、サポート外みたいです。
http://html5.cyberlab.info/elements/forms/form-method.html

しかし、今回はmethodを付与したいので、苦労しました。
どうやら、hiddenで`name=_method`を送ればいけるみたいですね。

PUTはhiddenで行いましたが、DELETEはjqueryのajaxで実装を行いました。

“`edit.html
form action=”/update?{{.Id}}” method=”post”>

元記事を表示

Goで遺伝アルゴリズムらしきものを実装する

この記事は[tomowarkar ひとりAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)の16日目の記事です。

# 遺伝的アルゴリズムとは
>遺伝的アルゴリズム(いでんてきアルゴリズム、英語:genetic algorithm、略称:GA)とは、1975年にミシガン大学のジョン・H・ホランド(John Henry Holland)によって提案された近似解を探索するメタヒューリスティックアルゴリズムである。人工生命同様、偶然の要素でコンピューターの制御を左右する。4つの主要な進化的アルゴリズムの一つであり、その中でも最も一般的に使用されている。[wikipedia 遺伝的アルゴリズム](https://ja.wikipedia.org/wiki/%E9%81%BA%E4%BC%9D%E7%9A%84%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)

# ルール
– ビット列の遺伝子配列を持つ個体の操作を行う
– 個体の集まりを集団

元記事を表示

Go 配列の重複を取り除く

# コード

配列のまま要素ごとに重複を探索すると計算量が増えるので一旦mapにする。
mapは重複したキーの存在ができないので、再度配列に変換すると重複が取り除かれた状態で取得できる。

“`Go
func distinct(arr []int) []int {
m := make(map[int]struct{})
for _, v := range arr {
m[v] = struct{}{}
}
var newArr []int
for k, _ := range m {
newArr = append(newArr, k)
}
return newArr
}
“`

# 使い方

“`go
func main() {
fmt.Println(distinct([]int{1, 2, 3, 1})) // => [1 2 3]
}
“`

元記事を表示

UnityでHTTP通信してみる

# はじめに
**「UnityでHTTP通信してみる」**というテーマでTechTrainアドベントカレンダーを書いていきたいと思います!

こういった記事はすでにいくつも存在していますが、コードが掲載されていても「サーバに実際にリクエストを送ってレスポンスを受け取る」という処理を自分のローカルでも試してみるためにはサーバが要りますよね。

やっぱりプログラミングは手を動かしてみることも大事だと思うので、簡単なAPIサーバをGoで書いたプロジェクトを作ったので、もしよければ下記のリンクからcloneして、**ローカルで動かしながら実際にHTTP通信を実装していただければより深い学びにつながる**と思います!
[sample-serverのgithubリンク](https://github.com/shun-shun123/sample-server)

# HTTP/GET
まずは、HTTP/GETから実装していきます。GETリクエストの場合は、クライアントから特にデータを含めたりはせず、特定のエンドポイントに対してリクエストを送信して、返ってきた結果を処理する形が主だと思います。なの

元記事を表示

Goでテストしたよ その1 

#この記事について
– 備忘録として残していくので不完全な場合があるかもしれません
– 間違っている箇所があった場合、教えていただけるとありがたいです

##practice.go

“`go:practice/practice.go
package main

import “fmt”

func Calculate(num int) int {
fmt.Println(“return: “, num * num)
return num * num
}
“`
単純な ( 整数 × 整数 )を返す関数です

##practice_test.go

“`go:practice/practice_test.go

package main

import “testing”

func TestCalculate(t *testing.T){
result := Calculate(20)
if result != 400{
t.logf(“Failed\n”)
t.Error(t)
}
}

“`
ポイントは

元記事を表示

Youtube Data API をwebsocketと一緒に遊んでみた

#この記事について
– この記事は Go7 Advent Calendar 2019 の 15 日目の記事です
– 間違っている場合は、ご指摘お願いします!

参考:
[Youtube Data APIの概要](https://developers.google.com/youtube/v3/getting-started?hl=ja)
[ToutrialEdgeさんのYoutube動画](https://www.youtube.com/watch?v=dniVs0xKYKk&list=PLzUGFf4GhXBL4GHXVcMMvzgtO8-WEJIoY&index=18&t=0s)

#この記事の概要
任意のYoutuberの登録者数をAPIからリアルタイムに取得して表示

実装は上記の参考動画を見ながら作ったものを紹介するだけです…
最後まで読んで頂けるとありがたいです!

#モチベーション
– Goで Youtube Data API からリソースを取得する体験
– Goで WebSocketを使い、リアルタイムな処理をする体験

#はじめる前に

元記事を表示

OTHERカテゴリの最新記事