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

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

Go言語 main.go 以外の関数がundefinedになる問題を解決

# Go言語のmain.go以外のファイルに定義した関数がdockerでundefined

go, mysqlコンテナを使用したアプリケーションで、以下のDockerfileの場合にエラーが起きた。

“`Dockerfile:Dockerfile
FROM golang:1.17.6-alpine
RUN apk update && apk add git
WORKDIR /go/src
CMD [“go”, “run”, “main.go”]
“`

docker-compose up したところ、 コンテナがexit していたため、ログを確認したところ、main.go以外のmianパッケージが読み込まれていないとのことだった.

スクリーンショット 2022-05-06 21.04.40.png

元記事を表示

2年目エンジニアのClean Architecture

この記事では、Clean Architectureの概要、構築をまとめています。

すでにこれらの内容を含んだ記事は多く存在していますが、私自身2年目に突入したことを機により理解を深めたいと思ったため、本記事を投稿するに至りました。

私ごとではありますが、今回初の投稿となりますので、過不足な点や分かりづらい点などがございましたら、ご指摘など頂けますと幸いです。

今回特に@hirotakanさんの[Clean ArchitectureでAPI Serverを構築してみる](https://qiita.com/hirotakan/items/698c1f5773a3cca6193e)を参考にさせて頂きました。
本記事は私が勉強がてら投稿したものになりますので、私のような初学者でこれから学習をしたい方には先述の記事をぜひオススメします。

# Clean Architectureの概要
![CleanArchitecture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2490180/f7277839-

元記事を表示

golangでパッケージを作成してmain.goから読み込んだらエラー

go言語を勉強中。
環境Windows10
VSCODE
go 1.17.7

プロジェクト名のディレクトリの下にmain.goを作成して
その下にmylibというディレクトリを作りました。
その中にgoファイルを作成して関数を作り。
main.goでその関数を呼び出そうとしたら以下のエラーなりました。
““
main.go:4:2: package projectname/mylib is not in GOROOT (C:\Program Files\Go\src\projectname\mylib)
““

この問題について以下の記事がありました。
[[GO言語]GOPATH以外の場所でのimportの挙動について整理](https://qiita.com/fetaro/items/31b02b940ce9ec579baf)

しかし、Go 1.16からGo-Moduleによるプロジェクト構成が推奨されたらしいという記事を発見しました。
“`
cd projectname
go mod init projectname
““

でモジュールを認識して実行するとこが

元記事を表示

【Golang】Goa✖️golang-migration✖️gorm でCRUD APIを実装する。

# まえがき
[前記事](https://qiita.com/crml1206/items/ccdf62e713e3c9599fd5)でGoaプロジェクトの環境構築を行なった。本記事ではgoaプロジェクトで[golang-migration](https://github.com/golang-migrate/migrate)と[gorm](https://github.com/go-gorm/gorm)を利用してCRUD APIを実装してみる。

 ① docker compose up でPostgreSQLコンテナ起動
 ② `golang-migration`でDBスキーマ作成
 ③ `gorm`でEntity作成・DB接続・CRUD処理実装
 ④ 動作確認

ソースだけ見たい人向け。

https://github.com/daisuketakakuwa/inventory-system

goaのGitHubにexampleプロジェクトがいくつかあるので、プロジェクト構成やコーディング等参考になるのでリンクを貼っておく。

https://github.com/goades

元記事を表示

可変長配列に要素を追加する処理の色々

# これは何?

go の slice や C++ の std::vector のようなものに要素を追加する場合に世の人々がどうするのかを調べた。

# そもそも

いわゆる可変長配列というものの代表的な実装は

* 適当にメモリ確保して、そこに要素を格納する
* 確保した容量に入らなくなったら、別の場所にメモリを確保して、そこに全部移動してから新要素を追加する

というものになっている。
この「別の場所にメモリを確保」の際にどうするのかが悩みどころ。
必要サイズぴったりにメモリ確保すると「1個追加」を1000回行った場合に絶望的に遅くなる。
多めに確保したいところだけど、多すぎるのはやっぱり損。

みんなどうしているのかなと思って調べてみた。

# 各実装

## go の slice

https://github.com/golang/go/blob/go1.18.1/src/runtime/slice.go#L193
辺りに実装がある。

1. 旧キャパシティが 256未満なら、新キャパシティは旧キャパシティの倍。
1. 旧キャパシティが 256以上なら、新キャパシティは旧キャ

元記事を表示

golang Enum?

Go のtypesパッケージでおもろい書き方があったのでメモ
“`golang
type BasicKind int

const (
Invalid BasicKind = iota // type is invalid

// predeclared types
Bool
Int
Int8
Int16
Int32
Int64
Uint
Uint8
Uint16
Uint32
Uint64
Uintptr
Float32
Float64
Complex64
Complex128
String
UnsafePointer

// types for untyped values
UntypedBool
UntypedInt
UntypedRune
UntypedFloat
UntypedComplex
UntypedString
UntypedNil

// aliases
Byte = Uint8
Rune = Int32
)
“`

元記事を表示

【競プロ】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

元記事を表示

OTHERカテゴリの最新記事