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

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

ABS Coins(ABC087B)をループ1回で解く

前々から興味はあったんですが、今年に入ってから[AtCoder](https://atcoder.jp/)をはじめました。
とりあえず出てみて慣れつつ、過去問をちょこちょこ解いたり[AOJ](http://judge.u-aizu.ac.jp/onlinejudge/)ちょっとずつやったりとかで地味に頑張ってます。
競プロはガチ勢は実行速度の早いC++とかC#とかでやってるイメージが非常に強いんですが、自分は個人的に慣れようと思ってたGoでやっています。
この記事を書いた次点ではまだ灰色ですが、

さて、ABS(※)の中にCoinsという問題があります。
https://atcoder.jp/contests/abs/tasks/abc087_b

※参考
AtCoder Beginners Selection
けんちょん(@drken)さんの下記の記事を参考にして作られた(で、いいんですよね?)、最初のチュートリアル的な10問です
[AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~](https://qiita.com/drken/it

元記事を表示

どの8進数リテラルが使えるかはプログラミング言語によって異なる

(この記事は [地平線に行く](https://yujisoftware.hatenablog.com/entry/octet_literal) とのマルチポストです)

8進数を表記する文法は、主に以下の3つがあります。
(二番目と三番目は分かりにくいですが `ゼロ オー`[^octet] です)

* プリフィックスとして `0` を付与する (例: `0123`)
* プリフィックスとして `0o` を付与する (例: `0o123`)
* プリフィックスとして `0O` を付与する (例: `0O123`)

これらのうち、各プログラミング言語がどの文法を採用しているかを表にまとめました。

|言語|`0`|`0o`|`0O`|
|:–|:–:|:–:|:–:|
|C|○|×|×|
|PHP|○|×|×|
|Perl|○|×|×|
|Java|○|×|×|
|Scala (~2.9)|○|×|×|
|Scala (2.10~)|×|×|×|
|Kotlin|×|×|×|
|C#|×|×|×|
|Rust|×|○|×|
|Swift|×|○|×|
|Go|○|○|○|
|

元記事を表示

AtCoder Beginner Contest 162 参戦記

# AtCoder Beginner Contest 162 参戦記

## [ABC162A – Lucky 7](https://atcoder.jp/contests/abc162/tasks/abc162_a)

2分で突破. 書くだけ.

“`python
N = int(input())

if str(N).count(‘7’) > 0:
print(‘Yes’)
else:
print(‘No’)
“`

## [ABC162C – Sum of gcd of Tuples (Easy)](https://atcoder.jp/contests/abc162/tasks/abc162_c)

4分で突破. なぜか間違って先にC問題やってた. ジャッジシステムが詰まってて、オンライン実行が使えなくて時間がかかった. まあ、問題文通りに書くだけなんだけど、TLE になりそうだったので定数倍に手を入れた.

“`python
def main():
from math import gcd

K = int(input())

r

元記事を表示

Go言語: スライスの構造

# この記事について
Go言語のスライスについて、その内部構造を整理します。

# まとめ
– スライスとは、配列をラップして使いやすくした型
– スライスとラップした配列はメモリ上では別のオブジェクト
– スライスは、配列へのポインター、配列のうち使用してるサイズ `Len`、配列の実際のサイズ `Cap` をパラメータとして持つ
– `reflect.SliceHeader` でスライスの構造を見ることが出来る

# 説明

### スライスの作成

まずは、スライス(Len = 5, Cap = 8 )を作成してみる。

“`go
a := make([]byte, 5, 8)
“`

こんな構造になる。
(Pointer の値 0xc00000a0d0 は今回試した際に確保された配列のアドレス)

|![slice001

元記事を表示

Go言語: ポインターとそれに関する型(uintptr, unsafe.Pointer)

# この記事について
Go言語の以下のポインター関連の型について簡単に整理します。

– `&` で取得するアドレス
– uintptr
– unsafe.Pointer

## `&` で取得するアドレス

– 変数のアドレスを表す整数値
– 値は整数値だが、型はそれが指す型に応じて異なる

“`go:例
i := 1
s := []string{“x”, “y”}

pi := &i // pi の型は *int
ps := &s // ps の型は *[]string
“`

– 当然ながらアドレスを参照できる → `*pi`とする
– しかし、C言語のようにポインターの演算はできない → `pi++` とか出来ない

## uintptr
– Go言語の Builtin 型であり、アドレスを格納できる大きさを持つ「整数型」
– 単なる整数型なので、アドレスを参照することはできない → `*pi` が出来ない
– 単なる整数型なので、演算ができる → `pi++` とかが出来る。
– ただしC言語とは異なり単なる整数演算に

元記事を表示

Goで作った自作ツールをGithubActionsでクロスプラットフォーム向けに自動リリースするテンプレ

# Goのクロスコンパイルばり便利
Goの便利な機能の一つにクロスコンパイルがあります。
同OSでの実行ファイルはもちろんのこと、例えばMac上でWindows用のexeファイルを作ったりできます。
GithubActionsと連携することで、さらに楽にクロスプラットフォーム向けに実行ファイルをリリースできるので
やり方を紹介します。

# 前提
– Go 1.13以降
– Go Modules使用
– [今回の開発環境はVSCode Remote Containerで用意](https://qiita.com/maroKanatani/items/75c38f6ab2f474ef7d37)(ここはまぁ何でも良いと思います)

# 手順
– プロジェクト直下に以下の.goreleaser.ymlを配置。

“`yml:.goreleaser.yml
project_name: sample # 任意の名前を設定する
env:
– GO111MODULE=on
before:
hooks:
– go mod tidy
builds:
– main: .

元記事を表示

Go言語のディレクトリ構成を考えてみる

#はじめに
最近Go言語の勉強を始め、文法についてそこそこ理解したので、APIサーバーでも立ててみようと思い、ToDoリスト開発を始めたが、Railsしか触ったことがなく、ディレクトリ構成が壊滅的にわからなかったので泣きべそを書きながらもまとめてみる。

#基本的なディレクトリ構成

├ cmd //main.goはここに置く
├ db
│ └ init //データベースの初期データを記述
├ pkg
│ ├ db //データベースへの接続
│ └ dcontext //データベースの操作
├ http
│ ├ middleware //main.goを走らせる前に行いたいことはここに記述
│ └ response //主にエラー処理を記述
└ server
├ handler //railsでいうcontroller的なもの
├ model

元記事を表示

GoenvとGo Modulesで環境構築

### 動作環境
– WSL2
– Linux
– Ubuntu 18.04.4 LTS

# 環境構築の方針

### バージョン管理
– Goenv
– 参考) [『goenvでGoのバージョン管理』
](https://qiita.com/fujitahiroshi/items/fe2631bc5816b5cf5251)

### パッケージ管理
– Go Modules
– 参考) [『Go Modules』](https://qiita.com/propella/items/e49bccc88f3cc2407745)
– 参考) [『【Go言語】modulesについて理解するために過去から調べてみた』](https://qiita.com/yoshinori_hisakawa/items/268ba201611401ca7935)

### GOPATH, GOROOT
– GOPATH
– $HOME/go
– 手動で設定 (詳細は後記する)
– GOROOT
– $HOME/.goenv/vers

元記事を表示

【Go言語】ginを使ってローカル環境を構築する

# はじめに
## 概要
この記事ではginを用いて、ローカル環境を構築し、ブラウザにHello Worldという文字列を表示させまでの実装を行います。そのためには、ginとは何か、ginを用いて何が可能となるかを学ぶ必要があります。実際にコードを書きながら、それらを1つ1つ丁寧に説明していきます。

## 目的
– ginを用いてローカル環境を構築する方法を理解すること

# 事前準備

## ディレクトリとファイルの準備をしよう
まずは、今回作業するディレクトリとファイルを準備しましょう。まずはディレクトから作成します。

### ディレクトリをmkdirコマンドで作成しましょう
以下のコマンドで指定の場所に新しいフォルダを作りましょう。

“`bash:ターミナル
% mkdir hello_world
“`
ここではhello_world名前のフォルダを作ります。

### cdコマンドでディレクトリを移動しましょう
先ほど作成したディレクトリに移動しましょう。

“`bash:ターミナル
% cd hello_world
“`

### touchコマンドでファイルを

元記事を表示

[Golang]UUIDを任意の数だけ生成するツールを作った件(解説付)

# はじめに

今回は、**UUIDを任意の数発行する必要が出てきた際に作ったツール**を共有します。
(すみません、めちゃめちゃ簡易なツールです。)

既存のwebサービスでは100件固定とかで作成できるものがあったのですが、数件〜最大2000件のUUIDを発行する必要があったので、サクッと作っちゃいました。
※UUIDについてのざっくり説明は、下の方に記載してます。

それでは、さっそく今回のコード全体から共有します。

# 今日のコード

“`golang:main.go
package main

import (
“flag”
“fmt”

uuid “github.com/satori/go.uuid”
)

var countOpt = flag.Int(“i”, 5, “only \”i\” option”)

func main() {

flag.Parse()

for i := 0; i < *countOpt; i++ { fmt.Printf("%v\n", uuid.NewV4().String()) } } ``` [GitHubは

元記事を表示

初心者がGoでTODOアプリ用のREST API serverを作った話

# 背景
2020年4月に六本木のミドルベンチャーに新卒入社したものです。内定インターンの頃から業務でサーバーサイドの開発をするときはgoを使ってきました。とは言うもののレベルで言ったら、初心者レベルです。脱初心者を図りたい自分は「どうやったらgoの開発スキルをあげることができるのか?」という質問を先輩方にしてみました。返ってきた答えは「自分でgoを使って何か作品をアウトプットをすると勉強になるよ。」とアドバイス頂いたので、個人でREST API serverを作ってみることにしました。今回題材として選定したのは、TODOアプリ用のREST API serverです。この題材を選んだ理由は2つあります。

– 誰かに使われるものを作りたい
– goを書くことに集中したい

1つ目はどうせ作るなら誰かに使われるものを作りたいと思い、TODOアプリ用のREST API serverを作れば、React.js, Vue.jsでTODOアプリを作って勉強する場面で誰かが活用してくれるのでは?と思ったからです。2つ目はなるべくgoを書くことに集中したかったので、TODOアプリなら業務ロジックやサ

元記事を表示

MacでGo言語を使ってOpenWeatherMapAPIを使用した際の備忘録

# 目的
MacでGo言語を使ってOpenWeatherMapAPIを使用した際の備忘録です

# 準備

環境
 macOS
 Homebrew

インストール

“`
$ brew install go
“`

# テスト

### hello world

本体コード

“`
package main
import “fmt”

func main() {
fmt.Printf(“Hello World!\n”)
}
“`

実行

“`
$ go run sample.go
Hello World!
“`

### Setenv

本体コード

“`
package main

import (
“fmt”
“os”
)

func main() {
// 既存の環境変数を取得
// fmt.Println(“1. $HOME:”,os.Getenv(“HOME”))

// プログラム中で設定してやることもできる
fmt.Println(“2. $TE

元記事を表示

【初めてのGO言語】初学者がローカル環境を構築して、Hello Worldをブラウザに表示させる流れ

# はじめに
## 概要
go言語初学者の人向けの記事です。環境構築した後にどうすればいいかわからない、動的言語(rubyやphp)しか経験したことがない、といった方の最初のステップとして、お役に立てると思います。

この記事ではディレクトリやファイルを作るところから始めて、ブラウザに「Hello World!」を表示するところまで行います。
## 目的
– ginなどのパッケージを用いずに、自力でローカルサーバを立ち上げる方法を理解すること

# 事前準備

## ディレクトリとファイルの準備をしよう
まずは、今回作業するディレクトリとファイルを準備しましょう。まずはディレクトから作成します。

### ディレクトリをmkdirコマンドで作成しましょう
以下のコマンドで指定の場所に新しいフォルダを作りましょう。

“`bash:ターミナル
% mkdir hello_world
“`
ここではhello_world名前のフォルダを作ります。

### cdコマンドでディレクトリを移動しましょう
先ほど作成したディレクトリに移動しましょう。

“`bash:ターミナル
% cd

元記事を表示

「Go言語で作るインタプリタ」を読みながらGo言語を勉強するだけの記事: その1

さすがに本の内容を書くのはアカンので、5節区切りくらいずつ、本を読み進めるにあたって必要なGo言語の知識を説明していきたいと思います。

※ 思ったより1.3節がしんどかったので、該当節で記事を分割することにしました

同じような勉強の仕方の人に役立てば良いなと思います。

# 書籍の要約
「900ページにも及ぶコンパイラについての書籍」と、「50行のRubyコードでLispインタプリタを実装する方法に関するブログ記事」との間にあるような書籍

↑著者前書きより。

言い得て妙だと思います。

種々あるインタプリタの中でも、tree-walking型のインタプリタを実装していく書籍です。
僕は現時点でまだ1章を読み終わっただけですが、REPLができて普通に感動しました。

だってまだ400行もコード書いてない。

まだまだたくさんコードを書くことになりますが、これは楽しい本です。
普段書いてるプログラミング言語が、裏側でどんな実装をされているのか、どういう解釈をしているのか。
それが少しでも分かるんじゃないかと思ってワクワクしてます。

少しでも気になったら、ぜひ皆様Amazonでポチ

元記事を表示

Goの環境構築方法

# はじめに
最近、仕事でGo触り始めたので、改めて環境構築の手順の確認と、今後Goを触りたいっていう人の参考になればなぁと思います。

ちなみに、自分の手元の環境は以下。
OS : macOS Catalina 10.15.2
→ 好奇心でzshにも切り替えてます。

# 環境構築方法
以下の2つをまとめていこうかな、と思います。
どちらも簡単なので、パーっと終わるかと。
あとPATH通したりの作業は必要ですが、Homebrewでインストールもできます。

– 公式からDLしてインストール
– goenvを使ってインストール

## 公式からダウンロード
https://golang.org/doc/install

### インストール
インストーラに従って進めるのみ。

### PATHを通す
“`
// bash使ってる人は、.bash_profileとかに置き換えてくださいー。
% echo ‘export PATH=”$PATH:/usr/local/go/bin”‘ >> ~/.zshenv
“`

### GOPATHの確認
“`
% go env GOPAT

元記事を表示

JSON から C#、TypeScript、Swift、Go などの型定義を生成してくれる VS Code 拡張機能

いつも、https://quicktype.io を使ってたのですが、VS Code 拡張機能があることにさっき気づきました。

[Paste JSON as Code](https://marketplace.visualstudio.com/items?itemName=quicktype.quicktype)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/6c31afd8-1b2f-7fff-e031-1e0c8c2d38af.png)

例えば OpenWeather のレスポンスの JSON をクリップボードに格納してる状態で VS Code のコードパレットから `Paste JSON as Code` を選択すると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/eb9fb42e-f3f5-6507-6a7c-1e568bab264f.png)

元記事を表示

Datadog APMをGoで使う

# はじめに

Datadog APMの簡単な特徴とGoで使用するための方法をまとめました。

公式サイトのドキュメントを見ていただくことを勧めますが、
補足資料として見ていただければと思います。

[公式ドキュメント](https://docs.datadoghq.com/ja/tracing/)
[TraceパッケージのGoDoc](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace)

また、ここではDatadogのAPM以外の機能については割愛します。

# APMとは

Application Performance Managementの頭文字をとった略語で、一般的にはアプリケーションやシステムの性能を管理・監視するものです。

DatadogのAPMではマネージドクライド、オンプレミスに関わらず分散トレーシングに対応しています。
Flame GraphやSpan Listなど整理された形でトレース結果を取得できるようになっています。

– Flame Graph
F</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>Go</div>
<div class='tag-cloud-link'>Datadog</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/muroon/items/ddda1f20c943dcd434c5'>元記事を表示</a></div>
<h3 id=アーキテクチャのアの字も知らない駆け出しエンジニアがドメイン駆動開発における依存性の逆転をgolangで実装しながら理解してみた

# アーキテクチャのアの字も知らない駆け出しエンジニアがドメイン駆動開発における依存性の逆転をgolangで実装しながら理解してみた

こんにちは!例のウイルスで大学の休みが延期されて、引きこもりながらますます楽しいプログラミングライフを送っているとさです。

今回は、ドメイン駆動開発における「アプリケーションサービス」と「リポジトリ」の部分の実装をしながら、
学習していきたいと思います。機能を分割して、コードをわかりやすくすることを目標にやっていきます。

# アプリケーションサービス

A君
アプリケーションサービスは、ユーザーのユースケースの機能を実装する部分になります。

B君
ユースケースってなんぞや??

A君
ユースケースっていうのは、ユーザーがシステムに対してできること
例えば、よくあるSNSで言えば、「ユーザーデータを登録」したり「ユーザー情報を更新」したり「ツイート」したり
なんてものがユースケースに当たるよ。

B君
へ〜、つまりはユーザーがシステムに対してできることって感じだな。

A君
そうそう、その機能を実装する部分を今回はアプリケーションサービスって読んで

元記事を表示

Goで日本語曜日を含む日付format

Goに限った話じゃないけど、日本語の曜日(月, 火, 水…)を表示したいときは、先に言語公式の機能でformatしてしまい、英語の曜日を文字列置換で置き換えるとコードがきれいになる。(効率的には文字列置換は重いと思うけど、読みやすさはだいぶ上がると思う)

“`go
package main

import (
“fmt”
“time”
“strings”
)

func main() {
t := time.Now()
weekdayja := strings.NewReplacer(
“Sun”, “日”,
“Mon”, “月”,
“Tue”, “火”,
“Wed”, “水”,
“Thu”, “木”,
“Fri”, “金”,
“Sat”, “土”,
)
fmt.Println(weekdayja.Replace(t.Format(“2006年1月2日(Mon曜日)”)))
// 2009年11月10日(火曜日)
}
“`

Goで複数の文字の組を一括置換したいときは、Replacerを使うとよいようだ。
https://golan

元記事を表示

Goで設定ファイルを扱う

# はじめに
本記事は、Goでアプリケーションで使用する設定値を外部ファイルから取得する方法についてのメモです。

## 設定ファイルのフォーマット
設定ファイルを定義するフォーマットとして、メジャーなものは以下のとおりです。

|フォーマット|特徴|
|:–|:–|
|ini|Windowsで主に使用。明確な仕様がないため実装に差異がある。|
|json|対応言語が多い。拡張性もあるが、コメントが書けない。[RFC4627](https://www.ietf.org/rfc/rfc4627.txt)に仕様が明記|
|yaml|JSON相当の汎用性があり、コメントが書ける。若干の学習が必要。|
|toml|新しいフォーマットでライブラリによる品質に差異がある。|
参考: [みんなのGo言語 改訂2版 ISBN978-4-297-10727-7](https://gihyo.jp/book/2019/978-4-297-10727-7)

どのフォーマットを使うかは好きなもので良いですが、オススメできそうなのはjsonかyamlです。

今回は、[以前の記事](https://qii

元記事を表示

OTHERカテゴリの最新記事