Go関連のことを調べてみた2022年05月05日

Go関連のことを調べてみた2022年05月05日

【競プロ】ScanningでTLEが発生してコケる

# はじめに
Go言語で競技プログラミングに臨んだことがある人なら, 一度は`fmt.Scan`関数の落とし穴にハマったことがあるのではないでしょうか. Go言語では標準入力を受け付ける際に, `fmt.Scan`関数, もしくは`bufio.Scanner`メソッドや`bufio.ReadLine`メソッドをよく用いります.
しかし, Go言語を使って競技プログラミングをやる場合, `bufio.Scanner`を使用しなければ困る場面があります.
今回の記事では, `fmt`パッケージの`Scan`関数と`bufio`パッケージの`Scanner`メソッドに注目しながら, `fmt.Scan`でTLEが発生する原因と解決策について紹介します.

[結論だけ知りたい人はこちらをクリック](#結論)

# fmt.Scan
まずは, `fmt.Scan`関数の詳細を見てみます.

## fmt.ScanでTLEが発生する
競プロにおいて, 大量のデータ入力が必要になる場合があります.
例えば, 競プロでよく見かける以下の入力形式において
“`
N
A1 A2 A3 … A

元記事を表示

Golangのappend()の実装とパフォーマンスについて

# この記事について

“`appned()“`の裏側の実装、またパフォーマンスについての調査です

## 目次
[1.はじめに](#はじめに)
[2.結論](#結論)
[3.実装について](#実装について)
[4.パフォーマンスについて](#パフォーマンスについて)
[5.まとめ](#まとめ)
[6.最後に](#最後に)

## はじめに
golangには“`append()“`という関数があります

“`golang
package main

import “fmt”

func main(){
x := []int{1,2,3}
fmt.Println(x) // x = [1,2,3]

x = append(x, 4)
fmt.Println(x) // x = [1,2,3,4]
}
“`

上記の例のように“`append()“`は
**スライスに要素を付け加える関数** です

しかしそんな都合よく **可変長配列** (実行時に長さが決定される配列) のようなものがあるのでしょうか……
(C言語を触りすぎて疑いの目?)

元記事を表示

[Go] ポインタを完全に理解した

# はじめに
この記事は、エンジニア経験1年の大学生が実務や個人の学習で勉強になったこと、詰まったことをまとめています。間違っている箇所などがございましたら、指摘していただけると幸いです。

# 背景
今まで恥ずかしながらポインタという概念を理解できていませんでした。なので、今回Goを新たに学習するにあたって、ポインタにつまずいたので、記事にして理解を深めようと思いました。

※自分なりに整理した記事であり、参考にならないかもしれないのでご了承下さい。

# 環境
– Go 1.18.1

# ポインタとは?
ポインタとは値のメモリアドレスを指す。

[参照](https://go-tour-jp.appspot.com/moretypes/1)

“`go
func main() {
var n int = 1

fmt.Println(n) // => 1
fmt.Println(&n) // => 0xc0000bc008
}
“`
Goでは変数に`&`を付けることで、その変数のメモリアドレスを取得できる。 なので、`0xc0000bc008`がメモリアドレスとなる。

元記事を表示

Goのインターフェイスの使い所を理解する。

以下のような、3種類の構造体があります。
それぞれ、自身の面積を返すAreaメソッドを持っています。

“`shape.go
package main

// 四角形
type Rectangle struct {
width float64
height float64
}

func (r Rectangle) Area() float64 {
return r.width * r.height
}

// 円
type Circle struct {
Radius float64
}

func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}

//三角形
type Triangle struct {
base float64
height float64
}

func (t Triangle) Area() float64 {
return (t.base * t.height) / 2
}

“`

それぞれの構造体のAreaメソッドをテストする関数を作成します

元記事を表示

DockerでGolang1.16.xビルド時に`//go:build comment without // +build comment`

# 経緯
Docker上でgolang1.16.xを実行中にエラーが発生した
“`
../pkg/mod/golang.org/x/tools@v0.1.10/go/internal/cgo/cgo.go:67:2: //go:build comment without // +build comment
“`

# 対応
1.17.xバージョンあげたら治った。
“`
FROM golang:1.17.9-alpine3.15
“`

元記事を表示

Go + echo + Air + Dockerで最小限かつホットリロードなAPI開発環境を作る

GoのREST API開発環境を作りたく、まずは最小限の環境を作ってみた
似たような記事はたくさんあるが、自分としては記事の数だけヒントを貰うことができたため自分の記事も誰かの役に立つと考え、備忘録も兼ねてここにメモしておく

# この記事のゴール
– Dockerコンテナ上でGo(echo)を稼働させる
– Airを使い、ホットリロードを効かせる
– ローカルホストにアクセスするとHello, world!を出力する

# ファイル構成
“`bash
– app_name # root
– .air.toml # Airの設定ファイル、自動出力
– docker-compose.yml
– Dockerfile
– go.mod
– go.sum
– main.go
“`

# Go Moduleの作成
:::note warn
Go及びDockerはインストール済みであることを前提に書いています
:::
“`bash
$ mkdir app_name
$ cd app_name
$ go mod init github.com/username/a

元記事を表示

Auth0×Golangで認証認可の処理を実施する。(チュートリアル Hands-on)

## はじめに
IDaaSのサービスとして注目を集めているAuth0。プロダクト作成にあたり必須の認証認可処理を短時間で高品質なモノを作れる。[前回記事](https://qiita.com/kouji0705/items/b80f7cc7316324757ee4)では、フロントの認証処理の記事を書いたので、今回はバックエンドの認可処理の機能を作成する。

### Auth0の仕組み
①ユーザ認証:フロント⇄Auth0で完結。
②認可処理:Auth0⇄バックエンドで完結。

①ユーザ認証
 フロント側でユーザIDとパスワードを入力し、Auth0でユーザ認証を実施する。承認済みのユーザであればJWTが返却され、それ以外であれば401エラーが発生する。フロント側ではJWTを元にAPIを叩けるかの認可処理が実施される。
②認可処理
ユーザ認証時に取得したJWTを基にAPIを実行できるかを実施する。このJWTには、ユーザ権限やユーザIDも含めることができるため、アクセスコントロールが実施できる。

認証認可が苦手な人は下記記事を見ておくとわかりやすいかと。

https://service.p

元記事を表示

Go 基礎

# 基礎文法

* _(アンダーバー)は、アンダースコア変数と呼び、宣言はするが後で使用しない変数を意味する。

“`:アンダースコア変数を使用してスライスの中身を取り出す。
for _, value := range values {
fmt.Println(value)
}
“`
“`:スライスからkeyとvalueを取り出す。
for key, value := range values {
fmt.Println(key)
fmt.Println(value)
}
“`

## apiのuriからリクエストパラメータを取得する
“`
var param string = r.FormValue(“param1”)
“`

## webサーバーを立ち上げる

* main.goファイルの中で `main` 関数が一番最初に実行される
* `go run main.go` でmain.goがコンパイルされたうえで実行され、api用のwebサーバーが立ち上がる。

“`golang:main.go
package main

import

元記事を表示

都道府県の型を例にGoで組み込み型を拡張する

ユーザーの都道府県を扱うアプリケーションを作成していたときに、

いままで
“` prefecture.go
const (
PrefectureHokkaido = “hokkaido”
PrefectureAomori = “aomori”
:
)
“`

というような県の定数をstring で宣言していていた。
この場合はUIに返すときには日本語に変換する必要があり愚直にmapを定義して変換していた。

“` prefecture.go
var prefectureToJpName = map[string]string{
“hokkaido”: “北海道”,
“aomori”: “青森県”,
“iwate”: “岩手県”,
:
}
“`

致命的な問題はなかったのだが、

– コードの量が増える
– 関連のあるものなのにコードが散らばってしまう

などの課題があった。

# 組み込み型として扱う

“` prefecture.go
type Prefecture string

const (
Hokkaid

元記事を表示

Goのテスト結果を取得してgitlab上で見れるようにしたい

### やりたいこと

– テストのレポートを取得したい
– テストのカバレッジを取得したい
– gitlabにその結果を反映したい

### テストのレポートを取得

最終目的はgitlab上で閲覧することなので、`JUnit XML`形式で出力できる必要があります。
そこで今回は[gotestsum](https://github.com/gotestyourself/gotestsum)を使って、テストレポートをXMLで出力します。

> gotestsum runs tests using go test –json, prints formatted test output, and a summary of the test run. It is designed to work well for both local development, and for automation like CI.

“`shell
# gotestsumのインストール
go install gotest.tools/gotestsum@latest
# テストレポートをXMLで出力

元記事を表示

gqlgenチュートリアルをできるだけわかりやすく解説する

# はじめに
エンジニアインターン2社目にしてGolang+GraphQLで開発することになりました。
最近こそ理解が進みはしたものの、今までREST以外の世界を知らなかった自分にとってgqlgenが何をしてくれるのか、何が便利なのかピンと来なかったので同じような境遇の方のために記事を書こうと思います。

# 前提知識
– GraphQLの基本がわかる
– Golangの基本文法がわかる

# gqlgenとは?
公式から引用
>gqlgen is a Go library for building GraphQL servers without any fuss.
・gqlgen is based on a Schema first approach — You get to Define your API using the GraphQL Schema Definition Language.
・gqlgen prioritizes Type safety — You should never see map[string]interface{} here.
・gqlgen en

元記事を表示

【Golang】GOPATH、GOROOTについて

# 前提
Macユーザー

# 参考

https://pleiades.io/help/go/configuring-goroot-and-gopath.html

# GOPATH
・ワークスペースのルートディレクトリ
・デフォルト値が「%USERPROFILE%/go」なので、変更する場合は「go env -w GOPATH=—-」で変更する。
・次のフォルダが格納されている

>src/ : **Go ソースコード**の場所(例: .go、.c、.g、.s)。
pkg/ : コンパイルされた**パッケージコード**の場所(例: .a)。
bin/ : Go によって**ビルドされたコンパイル済み実行可能プログラム**の場所。

# GOROOT
・↓の説明にある通り、異なるGoバージョンを変更する必要がないなら気にしなくていい。

>GOROOT は、Go SDK の場所を定義する変数です。異なる Go バージョンを使用する予定がない限り、この変数を変更する必要はありません。

元記事を表示

go test

test(std)
errors(std)
net/http/httptest(std)
testify(テストユーティリティ)
ginkogo(テストフレームワーク,BDD)
gomega(アサーションライブラリ)
gomock(普通のモック)
sqlmock(DBのモック)
go-txdb(実際のDBを使ったテスト用)
gotests (テスト自動生成)
gin testcontext(ginのコンテキストを使ったテストに使用)

wire

TDD(テーブルドリブン開発goの標準的なテスト指針)

元記事を表示

GoLand Select Home Directory for Go SDKのエラー

# GoLandでGOROOTを設定しようとしたら下記のエラーがでました
![スクリーンショット 2022-05-01 18.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/c9894f05-441d-da9d-2e4c-942f839ec06a.png)

“`
Select Home Directory for Go SDK
The selected directory is not a valid home for Go SDK
“`
この時にGOROOTに設定したパスは`/usr/local/Cellar/go/1.18.1/libexec`になります。
Macにhomebrewで`go version go1.18.1 darwin/amd64`が入っており、そちらのパスになります。

この時のGoLandのバージョンは`2020.3`でした。
![スクリーンショット 2022-05-01 18.47.30.png](https://qiita-image-stor

元記事を表示

Go,Vue,Firebaseを使ってポートフォリオを作成してみた。~参考リンク付き~

# はじめに
今回は私が転職活動で作成したポートフォリオについてまとめ記事を作成しました。
この記事ではアプリ開発にあたって苦労したことや、ポートフォリオ作成の参考になるようなことをご紹介できればと思います。

# 製作者の経歴
– 未経験でエンジニア転職し、1年程経験
– 受注開発でPHPを使用(フレームワークなし)
– 未経験時にRailsを使用してポートフォリオを作成し、一応springでの開発経験もあり。

# アプリの概要
基本的にはTwitterのような、投稿・コメント・いいね・フォロー機能のあるSNSをベースに、追加で
以下のような特徴のあるアプリケーションにしました。
– 目標起床時間を設定して、早起き達成日数を記録することができる
– 投稿にタグ付けしタグごとに朝活の共有ができる。

URLは下記です。よければ使ってみてください。
アプリのリンク:[ASAKATSUSNS](https://front.asakatsusns.com)
GitHub:[GitHub](https://github.com/taikyunn/asakatsusns)

# 開発し

元記事を表示

【Golang】Goaで「HELLO WORLD」する。

## まえがき
Goaの環境構築メモです。http://localhost:{port}/hello/{message} で「HELLO ${message}
」をレスポンスとして返すAPIを実行できるところまでやってみます。

参考

https://goa.design/learn/getting-started/

https://zenn.dev/ikawaha/books/goa-design-v3/viewer/getting-started#goa-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

## 手順1:Goのインストール

### Windowsユーザー
下記サイトよりインストールする。

https://go.dev/doc/install

### Macユーザー

“`
brew install go
“`

・`go version`でインストールされていることを確認
・今の最新バージョンは「1.17」
“`zsh
% go version
go version go

元記事を表示

Goで安価なAPIサーバーをデプロイする

FargateやらALBやらを使って結構料金のかかるインフラ設計にしている人が結構いるので今回はコスパの良いHTTPSなAPIサーバーを立てていきます。 * 完全に個人開発向けの話になります。

| | 使用するサービス |
| —- | —- |
| サーバー | ECS on EC2 |
| ドメインの取得 | freenom |
| DNS登録 | AWS Route53 |
| SSLの証明書 | Let’s Encrypt |
| インフラ管理 | Terraform |

## ドメインの取得

以下のサイトに従ってドメインを取得しましょう。

https://note.com/dafujii/n/n406f385651e2

取得できたら以下のように表示されます。

![スクリーンショット 2022-04-30 16.51.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/319ec28c-ee72-a285

元記事を表示

【Golang】assignment to entry in nil mapで怒られる原因

# 概要
go初学者です。
assignment to entry in nil mapで怒られる原因と、空のsliceへの値の追加との差を調査しました。

# 疑問点
下の場合、なぜs(slise)には要素を追加できて、m(map)には追加できない?

“`main.go
package main

import “fmt”

func main() {
var s []int
fmt.Println(s)
s = append(s, 1)
fmt.Println(s)

var m map[string]int
fmt.Println(m)
m[“first”] = 100
fmt.Println(m)
}
“`
### 出力

“`
[]
[1]
map[]
panic: assignment to entry in nil map
“`

### 原因

nilマップに要素を代入しようとしたから。

>Assigning to an element of a nil map causes a run-time panic.
[The Go Progra

元記事を表示

プログラミング言語を作ろう!

# この記事はなに?

– 先日チューリング完全を達成した、ここ数ヶ月行っている「プログラミング言語を作ろう」というYoutube配信のまとめ記事です。
– 各回で行った開発内容と、その開発の解説資料と動画アーカイブへのリンク、それから一旦チューリング完全を達成したのでそこまでの感想と反省点を記載しています。
– 主にお役に立つのは解説資料と感想の部分になるかな……?

# そもそもあなたはだあれ?

– バーチャルテックリード「ゆにる ゆに」です!
– とあるメガベンチャーのテックリードがバーチャル化されて出来たVtuberです。
– プログラミング言語を作る配信をしたり、チーミング戦術のお話をしたりしています。
– twitchなんかではスーパーマリオワールドのRTA走者もやってます。
– 詳しくは以下の自己紹介動画をどうぞ……!

# まずは各回の配信まとめ

|回数 |内容 |動画リンク|資料リンク|備考 |
|:——|——–|——–

元記事を表示

Go の Genericsで作れる(たぶん)一番便利なモノを作った

> 注意:Generics を 使用するためには Go 1.18 以上が必要です。

**有識者に怒られる覚悟で書いてます。先に謝罪しておきます。すみません。**

# TL;DR:一行で初期化されたポインタ作れるよ

“`sh
go get github.com/ktnyt/ptr
“`

“`go
package main

import (
“fmt”

“github.com/ktnyt/ptr”
)

func main() {
p := ptr.New(42)
fmt.Println(*p)
}

“`

# だからなんだよ

今までは Go で初期化されたポインタを作るためには最低でも二行使う必要がありました。

## 方法1 ポインタに値を突っ込む

“`go
p := new(int)
*p = 42
“`

## 方法2 変数のアドレスを取る

“`go
i := 42
p := &i
“`

これはつまり今までポインタを作るのに

“`go
p := func() *int { i := 42; return &i }()
“`

的な

元記事を表示

OTHERカテゴリの最新記事