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

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

GoでファイルのMD5ハッシュを取得する方法

### 指定したファイルのMD5ハッシュを取得して返す

“`
func md5File(filePath string) (string, error) {
file, err := os.Open(filePath)
if err != nil {
errors.Wrapf(err, “failed open file : %s”, filePath)
}
defer file.Close()

zr, _ := gzip.NewReader(file)
if err != nil {
errors.Wrapf(err, “failed read gz file : %s”, filePath)
}
defer zr.Close()

hash := md5.New()
if _, err := io.Copy(hash, zr); err != nil {
return “”, errors.Wrapf(err, “failed file hash c

元記事を表示

Goで文字列をスネークケースに変換する

### 指定した文字列をスネークケースに変換して返す
“`
func toSnakeCase(s string) string {
b := &strings.Builder{}
for i, r := range s {
if i == 0 {
b.WriteRune(unicode.ToLower(r))
continue
}
if unicode.IsUpper(r) {
b.WriteRune(‘_’)
b.WriteRune(unicode.ToLower(r))
continue
}
b.WriteRune(r)
}
return b.String()
}
“`

元記事を表示

Goでファイルをダウンロードする

### ファイルをダウンロードしてローカルファイルに保存する
“`
package main

import (
“io”
“net/http”
“os”
)

func main() {

fileUrl := “https://4.bp.blogspot.com/-2-Ny23XgrF0/Ws69gszw2jI/AAAAAAABLdU/unbzWD_U8foWBwPKWQdGP1vEDoQoYjgZwCLcBGAs/s1600/top_banner.jpg”

if err := DownloadFile(“avatar.jpg”, fileUrl); err != nil {
panic(err)
}
}

func DownloadFile(filepath string, url string) error {

resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Clos

元記事を表示

Go言語でRSSフィードを生成する

### RSSフィード(xml)の内容を出力する

“`
package main

import (
“fmt”
“log”
“time”
“github.com/gorilla/feeds”
)

func main() {
now := time.Now()
feed := &feeds.Feed{
Title: “ブログタイトル”,
Link: &feeds.Link{Href: “http://hoge.com/blog”},
Description: “ブログの詳細”,
Author: &feeds.Author{Name: “ohnishi”, Email: “ohnishi@hoge.com”},
Created: now,
}

feed.Items = []*feeds.Item{
&feeds.Item{
Title: “記事

元記事を表示

DMM アフィリエイトAPI にアクセスするGoの実装サンプル

### Fanzaの商品情報Jsonを取得して表示する

“`
package main

import (
“crypto/tls”
“encoding/json”
“fmt”
“io/ioutil”
“net/http”
“time”
)

type responsStatus struct {
Result struct {
Status int `json:”status”`
ResultCount int `json:”result_count”`
TotalCount int `json:”total_count”`
FirstPosition int `json:”first_position”`
} `json:”result”`
}

type targetService struct {
service string
floor string
}

var targetServices = []targetService{
{
service: “digital”,
floor: “vi

元記事を表示

大学に行った途端にオンライン授業になったので、囲碁サービスを突貫工事した話。

この記事は[N高等学校 (2) Advent Calendar 2020](https://qiita.com/advent-calendar/2020/n-highschool-2)の後出しじゃんけん24日目です。

N高を去年卒業(2期生)して、東京理科大学の理工学部 数学科に今年入学した[@kakudo415](https://twitter.com/kakudo415)と申します。
8年の不登校期間を超えて、ついに大学でのリアル授業だと意気揚々としていたらパンデミックの影響でほぼ全ての授業がオンラインになってしまいました。その中で生まれた不便を解消し**かけた**話を書きます。

# なぜ作るか

理科大の人気授業(多分)に「囲碁で養うコミュニケーション力」があります。
本来は教室に行って実際に対局をするのでしょうが、このご時世でそうもいかなくなってしまいました。
少なくとも僕が受講した前期においては、全てZoomと画面共有した棋譜ソフトによって授業が行われていて、ブレークアウトルームに分かれた学生同士が口頭で打ちたい手を相手に伝えると言った状況でした。

# 作る

世の中に

元記事を表示

mongo-go-driverでクエリを書く時「primitive.E composite literal uses unkeyed fields」のwarningが表示される

## 概要
GolangでMongoDBを使うとなった時に、おそらく使用するのが[mongo-go-driver](https://github.com/mongodb/mongo-go-driver)でしょう。mongo-go-driverでは[こちら](https://github.com/mongodb/mongo-go-driver/blob/master/examples/documentation_examples/examples.go)のサンプルにある通り、`bsonD`という型にクエリの項目を入れていくのですが、この通りに設定していくと`primitive.E composite literal uses unkeyed fields`というワーニングが表示されます。
ワーニングなので、このままにしておいても良いのですが、ワーニングを消すためにどうすれば良いのかというのを今回書きます。

## 対応
[MongoDBの Offical Go言語 Driverを使ってみる(1)準備・Insert](https://qiita.com/h6591/items/f3a7c1

元記事を表示

LeetCodeに毎日挑戦してみた 122. Best Time to Buy and Sell Stock II(Python、Go)

#### Leetcodeとは

[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。

golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)

#### 31問目(問題122)

#### 122. Best Time to Buy and Sell Stock II
問題内容

> Say you have an array `prices` for which the *i*th element is the price of a given stock on day *i*.
>
> Design an algorithm to find the maximum profit. You may complete as many transactions as you like (i.e., buy on

元記事を表示

【Go】Qiita 週間 LGTM 数ランキング【自動更新】

# 他のタグ

[`AWS`](https://qiita.com/items/e24b6279326a462d456c) [`Android`](https://qiita.com/items/8b3af051428d746f26c5) [`Docker`](https://qiita.com/items/ae11fca7d2eba445b037) [`Git`](https://qiita.com/items/74eacdbf363e260981c3) [`Go`](https://qiita.com/items/49d4537d95f878b3e91a) [`iOS`](https://qiita.com/items/e61a29a383d0403e92fc) [`Java`](https://qiita.com/items/4c3f84836bfdbb137226) [`JavaScript`](https://qiita.com/items/eaa7ac5b62a0a723edbb) [`Linux`](https://qiita.com/items/362e81e53c3f

元記事を表示

YAML+Mustache+go-generate で go の メタプログラミング をする

※この記事は、[CyberAgent PTA Advent Calendar](https://adventar.org/calendars/5741) 2020の24日目の記事です。

株式会社AbemaTV ビジネス開発本部 で広告システムのエンジニアをしています @shunta-furukawa です。
今日はクリスマスイブですね。メリークリスマスイブ!!

# はじめに

さて、[AJA SSPとその技術について](https://qiita.com/_tarof/items/3d568a23dba9b11b9ebe#go%E8%A8%80%E8%AA%9E)、でも触れられていましたが、サイバーエージェントで作られるシステムで Go言語が用いられることは多いです。

Go言語は、他の言語と比べて 言語仕様がシンプルなためハイパフォーマンスを出しつつも 扱いやすいために人気がある言語だと思います。反面、抽象化された賢い記法などがなく、記述量が多い言語でもあると思います。

– 書いていると気付いたらもう夜に…
– どうにか実装スピードをあげたい…

そんな時に、`go

元記事を表示

おまえもLGTM GIF画像を生成して、チームの生産性を上げてみないか?

# TL;DR

golangで
1. 既存gif拾ってきて
2. 文字列を合成して
3. LGTM画像を大量製造してみた

ソースコード: https://gist.github.com/tng527/484d77db0b86ff6c7aa13435073e1100

# 取り組みのモチベーション

レビュー時に拾い物のLGTM画像を貼っていたところ、以下のように喜んでもらえた。
![スクリーンショット 2020-12-22 13.44.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68104/a6280042-75bf-7b04-3378-24c8acc1ed27.png)

常に新鮮なLGTM画像を利用することで、メンバーのモチベが爆上がりするのではないか?(仮説)

拾い物のLGTM画像は面白みに欠ける画像が多い(個人の感想)ので、生成してみることにした。

# 注意点

いつもどおり、アドカレに間に合わせるための動けば良いやコードです。
エラー処理は基本してませんし、使い勝手の向上は今後

元記事を表示

VSCode + Remote Containerで環境構築(Go・応用編)

# 序文と謝辞

先日Go言語で簡単な方法を使ってリモートコンテナをつくりました(参考:[VSCode + Remote Containerで環境構築(go編)](https://qiita.com/honami/items/a1d943c31874cf576e43))が、作ったあと心の師匠(@MegaBlackLabel)からLGTMとともに以下のような~~ツッコミ~~天啓が。

元記事を表示

Goクイズ: Type assertions

# はじめに
本記事は, [Goクイズ Advent Calender 2020](https://qiita.com/advent-calendar/2020/goquiz)の12/24用に書かれました。

昨日は, @binzumeさんの[「Goクイズ: int = float64」](https://qiita.com/binzume/items/14f73f0f5da7f409fac9)でした。

Index expressionsに関する問題を出そうと思ったのですが, 以前[Twitterで出題した問題](https://twitter.com/task4233/status/1339189806958403585?s=20)と似ている気がしたので, 急遽Type assertionsに関する問題に取り替えました。

では, 本題に入ります。

# 問題
以下のコードを実行すると, どのように出力されるでしょうか?
[Playground](https://play.golang.org/p/28BcX6Eq4S-)

“`go
package main

import (

元記事を表示

Progate Goコースを終えた人へ贈るWeb API開発入門

# はじめに

この記事は[Go 3 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/go3)の23日目の記事です。

## あなたは誰?

プログラミング歴1年半くらいで、普段はWebプログラマ(Go, React)のインターンとして働いています。

## なぜこのような記事を書くに至ったか

この記事は[Progate](https://prog-8.com)のGoコースを終えたけどこれからどうやって学んでいけばいいかわからない人のためのガイド的なものです。

筆者自身、完全プログラミング初心者のときProgateにお世話になったのですが、Goのすべてのコースを終えたあとどのように学んでいけばいいのかわからずに困惑した記憶があります。

Progateの言語紹介文句には「Googleが開発した 人気上昇中のサーバーサイド言語」とありますが、Progateのレッスンは基本的な文法を学ぶものであり、WebアプリやWeb APIを作成するガイドはありません。
巷で「やるといいよ!」と言われている[A Tour of

元記事を表示

Goで作れる自作デスクトップアプリ【Wails】

この記事は[Go 2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/go2) 24日目の記事です。

# この記事について
デスクトップアプリをGoで作りたいと思ったこと、ありませんか。

私は以前ElectronというNode.js駆動のアプリフレームワークの[記事](https://qiita.com/saki-engineering/items/203892838e15b3dbd300)を書いたものです。それから数ヶ月後にGopherになり、「GoでもElectronみたいにデスクトップアプリって作れるのかな?」と思い立ちました。

今回はその私の欲求にぴったりの(笑)、Goでデスクトップアプリを作れるWailsというパッケージの使い方を紹介します。

## 環境
– OS: macOS Mojave 10.14.5
– go version go1.14 darwin/amd64
– github.com/wailsapp/wails v1.7.1

# Wailsとは?
![logo_cropped.

元記事を表示

バックエンド側で Sign In With Google を実装する

この記事は [LinuxClub Advent Calendar 2020](https://qiita.com/advent-calendar/2020/linuxclub) の 24 日目の記事です. ~~遅刻しました…~~
タイトル通り, バックエンド側で Sign In With Google を実装し, メールアドレスを取得するまでのお話です.

# 背景
個人的な案件で Google のアカウントでログインするという機能を実装する必要があったのと, `golang.org/x/oauth2` ではできない部分があったので, その部分を自分で実装しました.

環境は Go 1.15.5 で行っています.

## `golang.org/x/oauth2` でできなかった部分
詳しいことはライブラリのドキュメント[^1]や, ソースコードを見ていただければわかるんですが, `golang.org/x/oauth2` では, ライブラリで得る `oauth2.Token` 構造体が以下の形になっております:

“`go
type Token struct {
// Acces

元記事を表示

Firestore (in Datastore mode) のトランザクションの挙動を試してみる

(本記事は今年の夏頃に某勉強会で発表した内容の焼き直しです。参加者の方が読むとかなりの部分重複があると思いますがご容赦下さい?‍♂️)

# はじめに

旧Cloud Datastore(以降、旧Datastoreと記します)を長く使ってきましたが、そろそろFirestore in Datastore mode(以降Firestoreと記します)に真面目に取り組もうと重い腰を上げることにしました。

Firestoreの仕様はDatastoreとほぼ変わらないですが、主にトランザクション周りに大きな変更があります。
本記事ではFirestoreのトランザクションの挙動を実際にプログラムを動かしていろいろ検証してみます。

なお、本記事ではnative modeについては扱いません。
ただ、おそらくトランザクション周りの挙動はほぼ共通なのではと思っている(違っていたらごめんなさい)ので、参考にはなるかと思います。

基本的には公式ドキュメントに書かれている内容に沿って試します。
https://cloud.google.com/datastore/docs/concepts/transa

元記事を表示

Goのnetパッケージを理解する~1日目~

# はじめに

Goのパッケージの中でも、苦手意識しかないパッケージの一つである`net`パッケージの勉強をしていきます。

# netパッケージとは

`netパッケージは、TCP/IP、UDP、ドメイン名解決、UNIXドメインソケットを含むUnixネットワークソケットへのポータブルインタフェースを提供します。
`
引用:http://golang.jp/pkg/net

# とりあえずサーバの起動

“`go:main.go
package main

import (
“fmt”
“net/http”
)

func main() {
http.HandleFunc(“/”, handler)
http.ListenAndServe(“:8080”, nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “Hello World”)
}
“`

これで、8080番ポートにアクセスすると、`Hello World`と出力されるはずです

一旦、ここまでで、

元記事を表示

go get したのに command not found で配属直後に躓いた話

## 忙しい人向け

#### 解決策①: パスを通す

“`
$ export GOPATH=$HOME/go;
$ export PATH=$PATH:$GOPATH/bin;
“`

単純にパスが通っていないだけであればこれで解決するだろう。

#### 解決策②: go get で `$GOPATH/bin` に落としたバイナリを `$GOROOT/bin` にコピーする

しかし、こっちが本記事の結論。

今回は、Goのバージョンを切り替えやすくするために $GOROOT にシンボリックリンクを貼っていて、実行環境にバイナリ(実行ファイル)を go get できていなかった。

[解決策はこちら](https://qiita.com/y-kaanai/items/7a1d274a441003144106#%E8%A7%A3%E6%B1%BA%E7%AD%96)

## 経緯
当時の私は新たな MacBook PRO を手に入れ(貸与され)、配属先でGo製のAPIを開発することになっていたため、ワクワクしながらGoの開発環境を構築していた。

(後々躓くことも知らずに)言わ

元記事を表示

Go言語 学習記録

# Go言語とは
 2009年にGoogleが開発したプログラミング言語です。
 静的型付け言語であり手続き型言語に分類されます。

# 私がGo言語を学ぶ理由
 大きく分けて2つあります。

### 理由1. 違うタイプの言語に触れてみたいと思ったため
 私は今まで、いわゆる「オブジェクト指向」かつ「動的型付け言語」であるRubyとJavaScriptを主に勉強してきました。

○「動的型付け言語」と「静的型付け言語」の違いとは?
 ざっくり言うと、「変数を定義するとき、文字列型とか数値型などの型を指定するかどうかの違い」があります。
 動的型付け言語の場合、指定しませんが、静的型付け言語の場合だと指定する必要があります。

### 理由2.Goの将来性
 現在、Go言語の需要は伸びています。求人数などもそうですが、技術的に今後のトレンドになるみたいです。
 Goは、マイクロサービス(複数の独立したWebアプリケーションをまとめたWebサービス)開発向けの言語です。今、マイクロサービスが注目されており、今後Goが開発環境で使われていくことは間違いないでしょう。

# んで、実際に学ん

元記事を表示

OTHERカテゴリの最新記事