Go関連のことを調べてみた2021年01月10日

Go関連のことを調べてみた2021年01月10日

Go言語のrandパッケージ

# Goのrandパッケージ
プログラミング基本からGoの理解を文字におこして行こうと思います!

### 処理結果をランダムに表示
“`go
package main
import “main/rand” //「fmt」と同様””で囲む

}
“`
ランダムな数を扱うためのmath/randというパッケージ

### 乱数の生成
“`go
package main
import “fmt”
import “main/rand”

func main() {
fmt.Println(rand.lntn(10)) //0~9の乱数を生成
fmt.Println(rand.lntn(10)) //0~9の乱数を生成
}

//コンソール
1
8
“`
「rand.Intn(10)」と書くことで、0~9までの10個の整数の乱数を生成できる

### 乱数の注意点
“`go
package main
import “fmt”
import “main/rand”

func main() {
for i := 1; i <= 5; i ++ { fmt.P

元記事を表示

Goでアルゴリズムを学ぶ@再帰呼び出し

Go基礎構文の理解と、アルゴリズム脳トレが目的です。

アルゴリズムについて

再帰呼び出しとは

処理の中で自分自身を呼び出すことを再帰呼び出しといい、その関数のことを再帰関数といいます。

ユークリッドの互除法とは

2つの整数の最大公約数を求めるアルゴリズムです。手法については引用します。
>入力を m, n (m ≧ n) とする。
n = 0 なら、 m を出力してアルゴリズムを終了する。
m を n で割った余りを新たに n とし、更に 元のnを新たにm とし 2. に戻る。
>>引用:https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95

サンプルコードその1

ひとまずコード載せます。

“`go
package main

import “fmt”

func main() {
num

元記事を表示

【Go】io.Writerについて見てみる

Goのio.Writer interfaceについて調べました。

## io.Writerとは
`io.Writer` は以下のようなinterfaceです。

“`
type Writer interface {
    Write(p []byte) (n int, err error)
}
“`

writeメソッドを持ちます。

## 色んなwriteメソッドを見かける

– ファイルの入出力
– connectionへの書き込み
– バッファへの書き込み

など色々なwriteメソッドがあります。

これは上記のwriteメソッドをfileやTCPConn,Bufferで実装しているので
それぞれの`ファイル` に関して書き込みが可能です。

## ファイルという考え方
先ほど、 `ファイル` という言い回しをしましたが、 `ファイルディスクリプター` というものがあります。
これは、 `OSがカーネルのレイヤーで用意している抽象化の仕組み` です。
具体的には、数値の識別子のようなもので

– 0:標準入力
– 1:標準出力
– 2:標準エラー出力

のように数値ごと

元記事を表示

Golang入門1

インストールからHello world!

本文はこちら

元記事を表示

Go言語の繰り返し処理

# Goの繰り返し処理
プログラミング基本からGoの理解を文字におこして行こうと思います!

### 繰り返し処理
“`go
for i := 1; i <= 4; i ++ { //変数の初期化;繰り返しの条件;変数の更新 fmt.Println("Hello") } //コンソール Hello Hello Hello Hello ``` 変数iに1が代入され、「iが4以下」を満たす間{}内の処理が繰り返され 終わるたびに変数の更新「i++」が実行 ### 処理の流れ ``` //繰り返し処理の流れ ❶変数の初期化 ❷条件 ❸繰り返す処理 ❹変数の更新 ❷... ``` ```go for i := 1; i <= 5; i ++ { //❶i:=1;❷i<=5;❹i++ fmt.Println(i) //❸fmt.Println(i) } //コンソール 1 2 3 4 5 ``` 繰り返しの1周目は変数iは1 forの{}の中の処理(③)が終わるたびに、変数iが更新(④)され1,2,3,4,5と変化 そしてi <= 5(②)が成立しなく

元記事を表示

GoのGETリクエストについて

最もシンプルなGETリクエスト

“`go
resp, err := http.Get(“http://example.com/”)
“`

アクセストークンなどを付けたいときのGETリクエスト

“`go
req, err := http.NewRequest(“GET”, “http://example.com”, nil)
// …
req.Header.Add(“If-None-Match”, `W/”wyzzy”`)
resp, err := client.Do(req)
// …
“`

リクエストが終わったらレスポンスボディを閉じる。

“`go
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
“`

元記事を表示

Go言語の標準パッケージ

# Goの標準パッケージ
プログラミング基本からGoの理解を文字におこして行こうと思います!
[Go言語の基本❶はこちら](https://qiita.com/coxcoa/items/01cd4e30e965bcebb3ee)
[Go言語の基本❷はこちら](https://qiita.com/coxcoa/items/55e126bcbf67cf7505bc)

### 標準パッケージ
Goには標準パッケージと呼ばれるものがあり、100種類以上の便利な機能が
はじめから用意されている
これらを自分たちのプログラム内で自由に用いることができる

“`
fmt コンソールに出力できる
math/rand ランダムな数値を生成できる
time 時間に関する処理ができる
“`

### パッケージのインポート
“`go
package main
import “fmt” //標準パッケージをインポート
“`
インポートは、「package main」の下に「import “パッケージ名”」と記述

### パッケージの使い方
“`go
package m

元記事を表示

Goでアルゴリズムを学ぶ@全検索_線形検索法

Go基礎構文の理解と、アルゴリズム脳トレが目的です。

アルゴリズムについて

全検索とは

可能性をすべて調べ上げて問題を解決する手法です。
しらみつぶしに全て調べる手法ですね。仕事においても、問題に対して原因の切り分けができないときは多用してます。

線形検索法とは

一つ一つの要素を順番に調べていく検索方法です。
とりあえず頭から尻まで調べるといった、全検索の中で最も泥臭い部類じゃないでしょうか。

サンプルコード

ひとまずコード載せます。

“`go:main.go
package main

import “fmt”

func main() {
l := []int{1, 2, 3, 4, 5}
m := 5
r := solve(l, m)
fmt.Printf(“%v”, r)
}

func solve(a []int, b int) string {
r := “NG”
for i := 0; i < len(a); i++ { if a

元記事を表示

Go言語の条件分岐

# Goの条件分岐
プログラミング基本からGoの理解を文字におこして行こうと思います!
[Go言語の基本❶はこちら](https://qiita.com/coxcoa/items/01cd4e30e965bcebb3ee)
[Go言語の基本❷はこちら](https://qiita.com/coxcoa/items/55e126bcbf67cf7505bc)

### 条件分岐とは
ある条件に当てはまるかどうかによって処理を分ける
例えば、明日の天気(条件)によって傘を持っていくか(処理)を変える

### if文
“`go
package main
func main(){
score := 100
if score > 60 {
println(“合格”) //条件が成り立つ時の処理
}
}

//コンソール
合格
“`
if文を用いると「もし○○ならば☓☓を行う」という条件分岐が可能

### if文の条件式
“`go
package main
func main(){
score := 100
if score >= 60 {
print

元記事を表示

Goのエラー処理について ※雑な記事です。

Goには例外機構がないが、関数が複数の戻り値を返すことができる特徴を生かして以下のようなエラー処理を実装できます。

“`go:
result, err := method()
if err != nil {
//エラー処理
log.Fatal(err)
}
“`

「へえ、そうなんだ。とりあえずエラー処理はこう書けばいいんだ。」
この程度の理解度で問題ない気がしますが、なんとなく気になったのでまとめてみます。(※結局まとまりませんでした。)

そもそも例外機構ってなに?

実務で使用しているVB.NETでは例外処理は以下のように実装します。

“`vb:
try {
処理
} catch ( 例外のクラス 変数 ) {
例外処理
} finally{
後処理
}
“`

例外機構ってなに?とか書いたけど、構文に当てはめればエラー処理を実装できますよってだけですね。その構文がGoには存在しません。
エラーハンドリングできないとか致命的じゃん!!となりますが、そんなことはなくGoでもエラー処理は実装できます。その一つが最初に記載したも

golangでmultipart.File型の画像をリサイズ〜S3にアップロードするまで

# 概要
golang製のAPIサーバーを個人開発する中で、フロント側から受け取った画像ファイルをリサイズ等編集して、S3にアップロードするロジックを実装しました。その際、結構苦戦したので、要点をまとめていきたいと思います。

# 実践
## multipart/form-dataをパース
~~~go
file, _, err := r.FormFile(“image”)
~~~
fileにmultipart.File型としてgoで扱えるようになります。

## バッファーに内容を流し込む

~~~go
img := &models.Image{
UserID: uid,
Buf: &bytes.Buffer{},
}

_, err := img.Buf.ReadFrom(file)
if err != nil {
return &models.Image{}, err
}
~~~

今回のアプリはレイヤードアーキテクチャ+DDDを採用しているので、Imageモデルをポインタ型で宣言して、参照渡しでバッファーにデータを流し込んでます。この時バッファーを格納す

Using cgo with the go command

[Using cgo with the go command](https://golang.org/cmd/cgo/#hdr-Using_cgo_with_the_go_command)

###Cのコードが認識されない

“`go:c.go
// #include
import “C”
“`

//とimportの間に空行が入ってると前文(preamble)として認識されないようだ。

Go言語の基本❷

# Goの基本
プログラミング基本からGoの理解を文字におこして行こうと思います!
[Go言語の基本❶はこちら](https://qiita.com/coxcoa/items/01cd4e30e965bcebb3ee)

### 変数定義と代入の違い
“`go
package main
func main(){
n := 100
n := 200
println(n)
}

//コンソール
:=の左側に新しい変数がないとエラーになる
“`
変数定義の「:=」と、代入の「=」の違いに注意
2度変数nを定義しているためエラー

### 変数が使える場所
“`go
package main
func main(){
println(n) //使用不可
n := 100
println(n) //使用可能
}

//コンソール
変数nが定義されていないとエラー
“`
変数は、定義したあとでしか使えない
コンソールには、「変数nが定義されていない」ことを表すエラー

### 使わない変数
“`go
package main
func main(){
a :=

Go言語の基本❶

# Goの基本
プログラミング基本からGoの理解を文字におこして行こうと思います!

### 文字列とは
“`go
package main
func main(){
println(“Hello, Go”)
}
“`
“”(ダブルクォーテーション)で囲んでいないとエラーが発生する

### 出力の命令
“`go
package main
func main(){
println(“Hello, Go”)
}

//コンソール
Hello, Go
“`
printlnというのは、Goが用意している「命令」の1つ

「コンソールにprintln()の中のものを出力せよ」という命令
→コンピュータが文字列をコンソールに出力

### プログラムの構成
“`go
package main
func main(){
println(“Hello, Go”)
}
“`
Goのコードのファイルは、パッケージ定義部や関数定義部によって構成

ここでは「package main」と書かれたファイルの、main関数の{ }の中に命令を書くと
それが順に実行される

### 数値を

2021年Go言語フレームワークスター数比較

Go言語のフレームワーク(マイクロもフルスタックも含む)についてGithubの星比較です。(2021/01/05集計)
2021年版が見つからなかったので。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285581/8c78aa78-c058-ed45-3712-600cf7d338ba.png)

ginが強いですねー

参考

Go言語Webフレームワークランキング
https://qiita.com/loftkun/items/1a9951d1864bebdc51e1

Golang フレームワーク比較
https://qiita.com/yumin/items/5de33b068ead564ebcbf

Go言語インストール後の実行環境テスト

# 最終確認
インストール、Version確認後
VSCordでフォルダを作成し、期待する結果が出力されるまでテストする
[Go言語の環境構築はこちら](https://qiita.com/coxcoa/items/39782fe00be03de2dcf7)

# 実行環境テスト

“`
# テスト用ディレクトリを作成
$ mkdir -p ~/go/src/test

# ディレクトリへ移動
$ cd ~/go/src/test

# テスト用のファイルを作成
$ touch test.go

# テスト用のファイルを編集
$ vi test.go
“`

“`go

//test.go

package main

import “fmt”

func main() {
fmt.Printf(“test, go\n”)
}
“`

“`
# 作成したディレクトリへ移動
$ cd ~/go/src/hello

# ビルドしてバイナリファイルを生成
$ go build

“`
:wqで保存し、ビルドしてバイナリファイルを生成

#### 実行する

“`
$

Golangで自作Logger中でzapライブラリを使う際、CallerにLoggerより上の階層を出す方法

[この記事](https://qiita.com/emonuh/items/28dbee9bf2fe51d28153)を参考に、[zap](https://github.com/uber-go/zap)というログライブラリを使ってみました。
その時にログ出力されるCallerの情報についてハマったことをメモとして残します。

*2021/1/6追記*
*`conf.Build(zap.AddCallerSkip(x))` のように指定することで変更できることを知りました。*

# おさらい

* よく見かけるmainに記載するコーディング例で実行した場合を記載します。
* 出力例からわかる通り`main/main.go:30` という内容が出力されます。
* これはzapのログを出力したファイルのディレクトリ、ファイル、行が出力されており、トレースしやすい内容となっています。

“`go
package main

import (
“go.uber.org/zap”
“go.uber.org/zap/zapcore”
“time”
)

func main() {
conf

LeetCodeに毎日挑戦してみた 168. Excel Sheet Column Title(Python、Go)

#### Leetcodeとは

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

golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。

#### 38問目(問題168)

#### 168. Excel Sheet Column Title

#### 問題内容

> Given a positive integer, return its corresponding column title as appear in an Excel sheet.
>
> For example:
>
> “`
> 1 -> A
> 2 -> B
> 3 -> C
> …
> 26 -> Z
> 27 -> AA
> 28 -> AB
> …
> “`
>
> **Exa

Go言語の環境構築

# 環境構築に必要なもの
Go、VisualStudioCode、Goの拡張機能の3つをインストール

### ❶Goのインストール
Goは、homebrewを使ってインストール

“`
ターミナルを開く
spotlightからターミナルを検索して起動
$ brew update
$ brew install go
“`

まず、homebrewを最新バージョンにしておく
### ❷確認
“`
$ go version
“`

次のコードを実行して、goがインストールされているか確認
バージョンが返ってくれば、インストールされていることが確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958284/1a1ad428-6cc3-7fd1-2b15-e4d8cc57b3ab.png)

### インストールページから
[Goインストールページ](https://golang.org/doc/install)

インストール後にちゃんとできているか❷と同様に確認

“`

Go言語について触れてみる

# Go言語とは

“`
2009年にGoogleが開発したプログラミング言語
“`

Androidアプリの開発、iOSアプリの開発も可能

ちなみにGo言語の正式名称は「Go」
それだけだと別の意味にとらえられてしまうので、GolangやGo言語と呼ばれることが多い

# C言語の生みの親が開発した言語

Go言語はUNIXの開発に携わったロブ・パイク氏と
UNIXの開発とC言語を開発したケン・トンプソン氏が設計

Go言語はC言語を意識しながら設計されている言語で、C言語並みに処理が高速で、C言語以上にシンプルに記述することができる
時代に合わせ、より便利に使えるようにした新しいC言語。それがGo言語だと言える

# コンパイラ言語

“`
Go言語は、コンパイラ言語
“`

### コンパイラ言語とは
機械語に一括して変換してから実行するプログラミング言語のことで
処理が高速という特徴がある

その高速に処理できるコンパイラ言語の中でも、Go言語はより高速に処理ができる
JavaやC#は、仮想マシンを介して実行されるのに対して、Go言語は仮想マシンを介さずに実行される