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

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

【Golang】 よく使う関数のメモ

#この記事について
完全に自分用に書いているので説明は少なめで簡単な処理のものが多いですが、備忘録的に使うので随時更新します。

##stringからのキャスト
###`string` → `int`

“`go
func atoi(a string) (b int) {
b, _ = strconv.Atoi(a)
return
}
“`

###半角スペース区切りの `string` → `[]string`

“`go
func aToSlice(a string) (b []string) {
b = strings.Fields(strings.TrimSpace(a))
return
}
“`

###半角スペース区切りの `string` → `[]int`

“`go
func aToIntSlice(a string) (b []int) {
c := strings.Fields(strings.TrimSpace(a))
for _, v := range c {
d := atoi(v)

元記事を表示

GoのHTTP実装を読んだ知見をまとめる~Slice編~

# はじめに
業務での調査がきっかけにGoの[HTTP実装](https://github.com/golang/go/tree/master/src/net/http)を最近読み続けていて、やっとhttp実装の流れが大まかに理解できるようになった。

割と勉強になったことが多いのでその知見を複数回に分けて知見をまとめていく。
HTTP実装自体は意外にもかなり複雑なものとなっており、文面で説明づらいので、どちらかというと実装を理解した知見を汎化して書きたい。HTTP実装も紹介しやすい部分は適宜書きたい。

GoのHTTP実装とは、クライアントとサーバ両方含む。
TLS関連の処理やHTTP/2の実装は完全に読み飛ばしているので全く理解していない。HTTP1.0、HTTP1.1を対象とする。

初回はスライスである。

# GoのSlice

GoのSliceはゼロ値がnilなので内部構造としてはポインタであるように思いがちであるが、**構造体**である。以下がその定義である。

[定義](https://github.com/golang/go/blob/59bfc18e3441d9cd

元記事を表示

Go言語(net/http)でWebサーバーを作成(2)

前回の記事からだいぶ時間が経ってしまいました。
前回の記事は[こちらです](https://qiita.com/You-saku/items/ae99e61d551c41f66255)
本記事では golangでのhttp通信でhtmlファイルの表示をしてみます。

非常に説明が多いです。自分でサンプルコードを理解したのでそれを皆さんに共有できたらと思います。よろしくお願い致します。

今回の記事はあまり有益ではありません。執筆者自身もあまり良い記事だと思っていません。あくまで記録として執筆しました。

こちらのソースコードは書籍[「Go言語によるWebアプリケーション開発」](https://www.amazon.co.jp/Go%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA

元記事を表示

Go言語-fmt.Scan

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

### fmt.Scan
“`go
var input string
fmt.Scan(&input) //❶fmt.scan(&変数名)でコンソールに文字入力
}

//コンソール
Go //❷文字列を入力→❸変数inputに入力された値Goが代入
“`
fmt.Scan(&変数名)を使うとコンソールでの入力ができる
入力された値は変数inputに代入

### 入力の流れ
“`go
func main() {
var input string
fmt.Println(“次の単語を入力してください:go”) //❶
fmt.Scan(&input)              //❷
fmt.Printf(“%sと入力されました”, input)  //❸

//コンソール
//❶次の単語を入力してください:go
//❷go(コンソールで入力)           
//❸goと入力されました
“`
fmt.Scanを使うと入力ができるようになる

元記事を表示

AtCoder Beginner Contest 188のメモ

# 前置き

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

# 問題

https://atcoder.jp/contests/abc188

# A

“`Q_A.go
package main

import (
“fmt”
)

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

var flag bool = false
if X>Y{
if X-Y < 3{ flag = true } } else { if Y-X < 3{ flag = true } } if flag{ fmt.Printf("Yes\n") } else { fmt.Printf("No\n") } } ``` # B ```Q_B.go package main impo

元記事を表示

Go言語でCircleCIの環境変数の登録を自動化する

CircleCIで環境変数の登録を自動化するプログラムを書いたので、作成した内容を書いていきます。

# 課題
CircleCIの環境変数の設定の際にブラウザからポチポチして登録していたのですが、単純作業で登録が面倒なのと、誤操作により設定ミスが発生することがありました。

# CircleCIの環境変数について
まず環境変数の設定方法のバリエーションについてです。
大きくは、以下の6つのレベルで環境変数を設定することができます。今回の対象は、Project Environment Variablesの設定に関しての記事になります。
登録方法は、Build > Project > Settings で設定します。(もしこれ以外の登録方法をご存知の方がいらっしゃいましたら教えていただきたいです。)

– Global Environment Variables
– Project Environment Variables
– Job Environment Variables
– Container Environment Variables
– Step Environment Va

元記事を表示

【macOS】goenvを使用したGo(Go言語)のインストール

# 概要
**macOS**に**Go**(Go言語)をインストールする手順を記載しています。
GoのインストールにはGoのバージョン管理ツールである**goenv**を使用しました。
また、goenvのインストールには**Homebrew**を使用しています。
PATHを通す部分でつまずいたので、そこの解説も後半に記載しています。

#### [参考] 公式
– [Go](https://golang.org/)
– [goenv](https://github.com/syndbg/goenv)(github)
– [Homebrew](https://brew.sh/index_ja)

# 実行環境
– macOS Big Sur 11.1
– Homebrew 2.7.2

# インストール手順
### 1. Homebrewをアップデートする。
Homebrewをインストールできていない方は、こちらの[公式](https://brew.sh/index_ja)からインストールお願いします。

“`
$ brew update
“`

### 2. goenvのインス

元記事を表示

Go言語-randパッケージ

# 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.Prin

元記事を表示

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
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言語の基本❶はこちら](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 main

元記事を表示

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言語の基本❶はこちら](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 {
println(

元記事を表示

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言語-基本❶はこちら](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 := 1