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

Go関連のことを調べてみた2023年10月16日
目次

Goのべき乗をintで出力

べき乗は、Goのmath.Pow()で計算すると引数の型はfloat64にする必要があり、結果はそのままだとfloat64型で出てきます。

結果をintで出す方法について考え、いろいろ試して成功したやり方をご紹介します。

“`
var a,b,c int
var result int

a = 2
b = 3
c = 4

result = int(math.Pow(float64((a+b+c),2))

fmt.Println(result)
“`

引数となる変数の値をfloat64型に変換してやり
Pow関数が返す結果をint型に変換してやればよいだけでした。

元記事を表示

そのユニットテストは無価値である!!!

# この記事について

最近、『単体テストの考え方/使い方(Vladimir Khorikov著)』を読み、良いユニットテストについて学びました。
私は普段Goでコードを書く機会が多いので、Goのユニットテストを例に、書籍で学んだ内容を具体例を交えて説明してみたいと思います。

# 良いユニットテストを構成する4本の柱

『単体テストの考え方/使い方(Vladimir Khorikov著)』によると、良い単体テストは以下の4本の柱で構成されます。

1. 退行(regression)に対する保護
1. リファクタリングへの耐性
1. 迅速なフィードバック
1. 保守のしやすさ

テストケースの価値は、これらの4本の柱の掛け算で評価します。
**そのため、4本のうち1本でも備えていない性質があれば、そのテストケースの価値は「0」になってしまうのです。**

今回は、「リファクタリングへの耐性」が失われるユニットテストと失われないユニットテストを考えてみました。

# 壊れやすいユニットテストを書いてみる

まず、ユニットテストを書くために「DBからユーザの情報を取得する」ことを目的とし

元記事を表示

[mac]go初心者の設定まとめ

goenvを使うことで開発ごとにgoのバーションを切り替えることができるので、インストールを行う。
“`
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
“`

GOENV_ROOTの設定を行う。
下記はつまり、PATHにHOME/.goenv/binを設定していて、binは実行ファイルなので、このパスを通すことで実行できる。
内部理解や内容整理したい場合には、 vim .zsheで以降の設定を記述しても良い。
“`
echo ‘export GOENV_ROOT=”$HOME/.goenv”‘ >> ~/.zshenv
echo ‘export PATH=”$GOENV_ROOT/bin:$PATH”‘ >> ~/.zshenv
“`

GO_ROOTはgoのSDKの場所で、GOPATHはgogetでモジュールをダウンロード時に落とす場所。
バージョン切り替え時にGOPATHも変えないと、色々なバージョンが入ってきてしまうので、goenv使うと自動で切り替えてくれて、そのために以下を設定する。

“`
ech

元記事を表示

gormやgooseでDBスキーマを指定したいとき

gormでDMスキーマを指定する方法を調べると
“`
db, err = gorm.Open(postgres.New(postgres.Config{
DSN: `user=test password=test dbname=DB-NAME port=5432 sslmode=disable`,
PreferSimpleProtocol: true,
}), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: “YOUR_SCHEMA_NAME.”, // schema name
SingularTable: false,
}})
“`
このconfigで指定するやり方が出てきたがうまくできなかった
単純に、DB説情報にsearch_pathを指定すればいいだけだった

“`
“user=test password=test dbname=DB

元記事を表示

go getで入れたライブラリが一生使えなかった件

gormのマイグレだと外部キーがうまく作れなかったりしたので、他のライブラリを試そうとしたが、コマンドがうまく実行できなかった、、、

golang-migrateやgooseを入れてみたが、そもそもバージョンの確認すらできない、、、
GOPATHもGOBINも何度も確認して、bardとも口論したのに一生うまくいかない、、、

ということになり、3日つぶしたので、メモを残しておく

結論としては、go getだけではなくgo installをする必要があった
[Go 1.16でのgo getとgo installの変更点](https://re-engines.com/2021/10/11/go-1-16%E3%81%A7%E3%81%AEgo-get%E3%81%A8go-install%E3%81%AE%E5%A4%89%E6%9B%B4%E7%82%B9/)

使い分けに関してはよくわかってないが、gooseはinstallでバイナリファイルが作成され使えるようになった

golang-migrateはできない(なんで)

dockerが必要なのかとか、みんなwinsdowsじゃ

元記事を表示

Goで個人的によく用いる文法まとめ

# はじめに
Goを学びながら、何度もテキストを確認した文法をメモとして記します。
個人的な記録なため、内容に偏りがあります。

# 機能と文法

## modファイル作成
“`terminal
go mod init [project名]
“`

## コンソール入力
“`Go
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
fmt.Println(scanner.Text())
}
“`

## ローカル・パブリック
– 大文字から始まったらパブリック
– 小文字から始まったらローカル

## 文字↔︎数値
“`Go
i, _ = strconv.Atoi(s) //文字→数値
s = strconv.Itoa(i) //数値→文字
“`

## 構造体
ポインタを使用すると、関数に構造体のポインタを渡したり、構造体のフィールドを変更したりする際に、呼び出し先で変更が反映される利点がある(これは構造体に限らず)。
しかし、ポインタを用いずに構造体に直接アクセスす

元記事を表示

Go言語でConfigファイルをビルド時に埋め込む方法: embedパッケージの活用

## はじめに

Go言語の強みの一つにポータブル性があります。
Go言語はビルドをするとシングルバイナリになるため、ビルドしたバイナリをコンテナやらサーバーに持ち運ぶだけで簡単に実行できます。

多くのアプリケーションでは設定情報などをコンフィグファイルとして外出ししている場合がありますが、そのような場合はビルドしたバイナリファイルはコンフィグファイルに依存してしまって、デプロイ時にコンフィグファイルも一緒に持ち運ぶ必要が出てきます。

しかし[go:embed](https://pkg.go.dev/embed)を使うことでコンフィグファイルもビルド時にバイナリに含めることができてしまうのです!

## 前提

– go1.16以上

## ディレクトリ構成

“`plantuml
@startuml
salt
{
{T
+ demo
++ config
+++ config.go
+++ config.json
++ go.mod
++ main.go
}
}
@enduml
“`

プロジェクト全体を見たい人はGitHubに公開し

元記事を表示

【VScode・Go言語】単体テストの設定をカスタマイズして快適な開発体験を!

早速ですが、Gopherの皆さんはこちら↓のVScodeのTesting機能を活用されていますでしょうか?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1220258/f14f0e20-2928-ce12-b0ea-35909559bea1.png)

Testing機能を活用すると、コマンドラインからテストを実行するのに比べて、以下のようなメリットがあります。

– テスト実行時
– ボタン1つでパッケージごとにテストを実行したり、特定のテストケース一つだけを実行できる
– つまりコマンドラインから、実行したいテストケースを特定するためのオプションを指定する必要がない
– ルートディレクトリから対象のテストまで辿っていくのって意外に面倒…
– テスト実行後
– より視覚的にテストの失敗箇所を特定することができる
– コマンドラインから実行するときは、テスト結果の確認のためにターミナルの文字をスクロールして探す必要がある

ただし、実際の開発現場で使う

元記事を表示

[超すごい??] Line × ChatGPTで全知全能を実現

# 全知全能の光平くんという公式アカウントを作成した。
質問やお悩み相談が来た際に、GPTエンジンを使用して、
完璧な返答をするLINE公式アカウント用のバックエンドアプリを作成しました。
ページ中央部にLineのQRコードがありますので、触って遊んでみてください。

![385544301_628796422781454_6186934858729003709_n](https://github.com/kouhei-github/Line-Reply-Message-OpenAI-Golang/assets/49782052/2625b4fc-f7da-4d05-865f-297760a2d866)

## GitHub リポジトリ
下記よりコードをご確認ください
[https://github.com/kouhei-github/Line-Reply-Message-OpenAI-Golang](https://github.com/kouhei-github/Line-Reply-Message-OpenAI-Golang)

## 動作確認
下記から公式アカウントを

元記事を表示

Goで学ぶGraphQLサーバーサイド(1)

こんにちは。

今日の記事からGoで学ぶGraphQLサーバーサイドについて記載しています。

# はじめに

GraphQLはリクエストクエリを書くことで、必要な分のデータを柔軟に取得することが可能なAPI形式です。
RESTとは違うその仕組みはクライアント目線ではとても便利なものですが、サーバーサイドに立ってみると無限の組み合わせがあるリクエストクエリに一体どう対処しているのか不思議に思う人もいるでしょう。
この本では、Goのgqlgenというライブラリを用いてGraphQLサーバーを作る過程を通して、サーバーサイドGraphQLを理解・開発するのに必要な知識を解説していきたいと思います。

## この本について
ウェブAPIのアーキテクチャとしてメジャーなものはREST APIかと思いますが、近年はGraphQLの形式で自社サービスAPIを公開する例が増えてきています。
リクエストーレスポンスが1:1対応されており取得可能情報が固定されていたREST APIとは異なり、開発者が欲しい情報のみを柔軟に取り出してくることができるGraphQLはクライアント目線からはとても便利なも

元記事を表示

Ginを用いたサーバーレスアプリケーションをAWS CDKでデプロイする方法

## はじめに
Glolang WebアプリケーションGinを用いたサーバーレスアプリケーションをAWS CDKを使ってAWS Lambdaにデプロイします

今回用いたコードは[GitHub](https://github.com/tomoish/gin-aws-lambda)で公開しています。

## 環境
Golang: 1.20.4
AWS CDK: 2.96.0

## ディレクトリ構成
“`
├── gin
│ ├── bin
│ │ ├── bootstrap
│ │ └── myFunction.zip
│ ├── main.go
└── infra
“`

## Gin
### Gin Tutorial
今回は[Gin Tutorial](https://go.dev/doc/tutorial/web-service-gin)で作れるRESTful APIをデプロイしようと思います。

このTutorialを終えた後のmain.goは以下の通りです。

“`Golan

元記事を表示

intel上でLXDCLIを用いてGO+Pythonの環境を爆速で構築する

## 目的
Goの環境を構築しろと言われることは多いと思う。今回はintel上でlxdcliを用いてgoの環境を構築しようと思う。

## 構築
lxdfile
“`bash
CONTAINERNAME ubuntu-go
FROM ubuntu/23.04

RUN export DEBIAN_FRONTEND=noninteractive
RUN timedatectl set-timezone Asia/Tokyo && hostnamectl set-hostname ubuntu-go
RUN apt-get -y update

RUN dpkg –configure -a
RUN echo “\n\n\n” | apt-get -y install openssh-server
RUN apt-get -y install docker docker.io docker-compose nano curl

RUN echo -e “root:password” | chpasswd
RUN echo -e ‘PermitRootLogin yes’ >> /et

元記事を表示

Next.js × Go のWebアプリをDocker上で作成してみませんか? 〜バックエンド実装編〜

# はじめに
?こんにちは!Web系の企業に勤務し、地方からフルリモート勤務をしている@takakouと申します?️✨

今回は、「**Next.js × Go のWebアプリをDocker上で作成してみませんか? 〜バックエンド実装編〜**」というテーマで記事をシェアします!??

この記事を執筆しようと思った経緯としては、私自身が **Next.js** × **Go** × **Docker**の組み合わせでアプリを作成しようとした際、この技術スタックに関する情報が少なく、詰まることも多かったからです??

そこで、同じように、この組み合わせの技術スタックに興味を持つ初学者の方々のために、Dockerを使用して環境を構築する方法を詳しくシェアしたいと思い、この連載を始めました。?

記事執筆は未熟者で、至らない点もあるかと思いますが、皆さんのコメントやフィードバックをお待ちしています!??
# 目次

1. [前提条件 ?](#1-前提条件)
1. [対象者 ?](#2-対象者)
1. [動作環境 ?️](#3-動作環境)
1. [技

元記事を表示

Go言語で作ったPubSub起動のCloud Functionsの関数をローカル環境(Mac)で動かす

# 概要

PubSubのイベントを受け取って起動するGo言語で作った Cloud Functions の関数をローカル環境で実行する方法

## 参考

– [Functions Framework  |  Google Cloud Functions に関するドキュメント](https://cloud.google.com/functions/docs/functions-framework?hl=ja)
– [Function Frameworks を使用した関数を実行する  |  Google Cloud Functions に関するドキュメント](https://cloud.google.com/functions/docs/running/function-frameworks?hl=ja)
– [ローカル関数を呼び出す  |  Google Cloud Functions に関するドキュメント](https://cloud.google.com/functions/docs/running/calling?hl=ja)

# 事前準備

– goのversionを1.18

元記事を表示

Sprintf関数は本当に遅いのか、検証してみた

## 経緯
Goのプログラムで、文字列を結合する処理を行うために以下のようなコードを書いてプルリクを出したところ、

“`go
id := “1000”
url := fmt.Sprintf(“https://example/path?id=%s”, id)
“`
以下のような指摘をもらった。
>Sprintfは遅いので、文字列結合を使ってください

当時は、素直に“`url = “https://example/path?id=” + id“`のように書いて終わったのだが、本当に遅いのか、実証できていなかったので確認する事にする。

## 検証環境
macOS Ventura 13.2.1

“`shell
$ go version
go version go1.21.2 darwin/amd64
“`

## 検証
Sprintfと、単純に文字列を結合する処理にかかる時間を比較するため、以下のメソッドを用意する。
“`go
func formatStringUsingUnion() {
_ = “Hello” + “,” + “world”
}

f

元記事を表示

gqlgenでカスタムモデルを使った際に panic: interface conversion でハマった話

# 概要
DataLoaderを使うためにgqlgenにカスタムモデルを導入した際、
`gqlgen`で`panic: interface conversion`エラーが発生したので、その解決の記録を残します。

DataLoaderってなんやねん って方は以下がわかりやすいです。
簡単にいうと、N+1問題を避けるためにバッチ処理を使って効率的にデータを取得しようってことみたいです。

https://dev.classmethod.jp/articles/graphql-dataloader-sample/

# おことわり
– 筆者はBE1年目の駆け出しGopherです。
– 表現に曖昧な箇所や不正確な箇所があるかもしれませんがご容赦ください。

# ハマった内容
### グラフモデルの生成
schemaを以下のように記述し、gqlgenしました。

“`graphql:schema.graphqls
type User {
id: ID!
name: String!
department: Department!
}

type Department {
# 省

元記事を表示

Remote Developmentを使って爆速でGo&PostgreSQLの環境構築を行う

こんにちは!
Remote Developmentを使ったGoの開発に関してまとめましたので参考になれば幸いです

## github リポジトリ
以下をcloneすることでこの記事に書かれてることが再現できます!

https://github.com/mikaijun/go-postgre-onboarding/

## こんな方にオススメ!

– これからGoを学習したい方
– Goを使ってデータベースとのやりとりを行いたい方
– ローカルマシンを汚したくない方(brewなど)
– Dockerは使いたいけど詳しい設定はよくわからない方
– Githubを使ってGoのコードをリモートにpushしたい方

### この記事で扱わないこと

– VSCodeのインストール方法
– Docker(Docker Desktop)のインストール方法
– Githubのアカウント登録
– SQLの解説や使用したGoのパッケージの解説
– SSHを使用したGitHubへの接続
– 最速で開発できることをを目的としてますのでビジネスで開発する場合はSSHの使用を検討してください

## Re

元記事を表示

【Golang】base64でエンコードされたデータをデコードして、AWS S3にアップロードする

## 概要
Goを使って、Base64でエンコードされた文字列をJSONで受け取り、S3にアップロードしてみます。APIアクセス周りはEchoを使いました。
ファイルをS3にアップロードする際に、クライアントサイド/サーバーサイドのどちらから行うのか、またデータをどのようにやりとりするのか、などの観点で色々方法はあると思いますが、今回はBase64文字列をJSONで受け取り、デコードしてS3にアップロードする方法を試してみました。

参考:[ファイルをS3にアップロードするときはサーバー?クライアント?](https://kenny27.hatenablog.com/entry/2019/06/07/233541)

### バージョン
– Echo:4.5.0
– Go:1.17.1

## ファイル構成
“`
main.go
aws/
├ config.go
└ s3.go
“`

## aws-sdk-goのインストール

“`go
go get -u github.com/aws/aws-sdk-go
“`

## config.go
以下のように、awsのアク

元記事を表示

Mac(m1)でProtoc (Protocol buffer)をインストールしたけど見つからなくて困った話

gRPCを試してみたくて、protocl buffer (protoc)をインストールの仕方を調べてみたけどスムーズにいかなかったのでメモ

### 環境
M1 mac (pro)

### やったこと

まずはprotocol bufferをインストール
“`
brew install protobuf
“`

インストール成功(してるっぽい)
> ? /opt/homebrew/Cellar/protobuf/24.3: 395 files, 13.2MB
==> Running `brew cleanup protobuf`…
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Caveats
==> protobuf
Emacs Lisp files have been installed to:
/opt/homebrew/share/emacs/site-l

元記事を表示

【初心者向け】はじめてのWebアプリケーション開発 デモアプリ作成 フロントエンド編

## はじめに
 言語学習を終えた後、本格的なWebアプリを開発する前に、フロント、バックエンド、Dockerなど使用予定の技術をを組み合わせた簡単なデモアプリを作成しました。
 作成した理由は、いきなりすべての技術を組み合わせたアプリを開発すると、設定がごちゃごちゃになると考えたからです。
この記事では言語 + フレームワーク + UIフレームワークの環境構築について記載します。
 WindowsPCでUbuntuでLinux環境を構築して開発を行いました。Ubuntu等の環境設定方法は以下の記事に記載しました。
[windowsでUbuntu,homeblew,nodebrewをインストール、VSCodeでTypeScript環境を構築する](https://qiita.com/bear05/items/265401176698bccbfee4)

## バージョン等
Windows10
Ubuntu 20.04.4 LTS
Homebrew 3.5.7
nodebrew v18.7.0
node v18.7.0
npm 8.15.0

エディタ…VSCode
typescrip

元記事を表示

OTHERカテゴリの最新記事