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

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

[Golang]Requests

とりあえずAPIテストに必要なサンプルは揃えた

## GetのAPIを作成

“`go
func TopPage(router *gin.RouterGroup) {
router.GET(“/”, func(c *gin.Context) {
c.HTML(
http.StatusOK,
“index.html”,
gin.H{
“title”: “Users”,
},
)
})
}

“`

## requestを送って返ってきた値を取り出す

“`go
func TestRes(t *testinffunc TestRes(t *testing.T) {

resp, _ := http.Get(“http://localhost:8080/ping”)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
//これが中身
var post responseBody
if err := json.Unmarshal(body, &post); err !=

元記事を表示

Fiberとは(golang)

# Fiberとは

golangのフレームワークの一種です。
[公式ページ](https://github.com/gofiber/fiber) によると、

> Fiber is an Express inspired web framework built on top of Fasthttp, the fastest HTTP engine for Go.

FiberはFasthttp(Go言語で最速のHTTPエンジン)上に構築された、 ExpressにインスパイアされたWebフレームワークです。
(イメージとしては、golangの速さ+ [Express](https://expressjs.com/) の使い易さを合わせたフレームワークといった感じでしょうか)

## Fiberを実際に使ってみる

実際にコードを見ていきます。

初めにインストールするためには、go getコマンドを実行します。

“`
$ go get -u github.com/gofiber/fiber/v2
“`

main.goに以下のように記述します。

“`main.go
packa

元記事を表示

【Go+React】株のipoを管理するWebアプリをSPAで作ってみた【個人開発】

# 目次
| 項番 | ページ内リンク |
|:—-:|:————-|
| 1 | [1. このプロジェクトの概要](#1-このプロジェクトの概要) |
| 2 | [2. どのような機能を](#2-どのような機能を) |
| 3 | [3. どのような技術を用いて](#3-どのような技術を用いて) |
| 4 | [4. どのような工夫をして](#4-どのような工夫をして) |
| 5 | [5. どのような成果に繋がったのか](#5-どのような成果に繋がったのか) |
| 6 | [6. 今後やりたい事](#6-今後やりたい事) |

# システム
**【プロジェクト名】**
manamana ipo管理ツール
![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455017/521daa34-9d63-082a-c71d-b53d8bc4df53.png)

# 1. このプロジェクトの概要
ipo(新規公開株式)の自動申し込み、
および現資産の確認・管理を行うシステム

元記事を表示

個人開発でgo-elasticsearchを用いたので、使い方を整理する

最近個人開発でElasticsearchを利用しまして、それに伴いgolangからアクセスする公式のgoクライアントを使用しました。
その際に感じたのがsearchやinsertあたりしか掲載されていないネット記事が多く感じたので、今回それ以外のとこも含めてまとめてみようと思います。

# 注意点
* この記事のコードはのelasticsearch 8系を想定しています。8系以下のバージョンは別途別の記事を参考にしてください。(個人開発で使用したのは8.3.3)

* 個人開発で用いた際に確認した環境はDockerとwindows11(ローカル上)です。

# how to
# client作成
client作成は[GitHub](https://github.com/elastic/go-elasticsearch)のusageや[qiitaの記事](https://qiita.com/shiei_kawa/items/d992f7fdd4c75906ea0b)に乗っていますので割愛します。

* 一応上記の記事に乗っていない細かいこととして
もしdocker-composeでgoと

元記事を表示

プログラミング言語Go アウトプット(6章)

# はじめに
これまでの章のアウトプットやプログラミング言語Goのアウトプットをしようと思ったきっかけなどは[こちら](https://qiita.com/AtomuIshida/items/6e05c02a2bd82f1e133d)でまとめているのでぜひ読んで欲しいです。

# 6章 メソッド
## 重要・学びになったと思うところ
### メソッドの宣言
平面幾何学のための簡単なパッケージを実装する
“`golang
pacakge geometry

import “math”

type Point struct{X,Y float64} // float64型のXとYを持つ構造体Pointを定義

func Distance(p,q Point) float64 { // Point型のpとqを受け取り、float64型の値を返すDistance関数を定義
return math.Hypot(q.X-p.X, q.Y-p.Y) // math.Hypotは受け取った二つの引数の二乗の合計値の平方根を返す関数
}

func (p Point) Distance(q Poin

元記事を表示

postgresqlに接続するとSSLが有効になってないため弾かれる場合の対処方法

# はじめに

`golang-migrate` で`postgresql`に接続して`migrate`を試みたところ、以下のエラーが発生した。

調べたところ、`postgres`コンテナーがデフォルトで `SSL` を有効にしないために起こるとのことだったので対処方法をまとめる。

“`bash
migrate -path db/migration -database “postgresql://username:password@localhost:5432/dbname” -verbose up
2022/10/30 17:19:16 error: pq: SSL is not enabled on the server
“`

https://www.postgresql.jp/docs/9.2/libpq-ssl.html

https://github.com/golang-migrate/migrate/tree/master/cmd/migrate

# 対処方法

`?sslmode=disable`をデータベースURLに追加することで接続が可能になります

`

元記事を表示

簡単!CORSの設定

# バックエンドにリクエストを送れないのはCORS設定できてないからかもしれない

例えばReact + Goで開発をしているとします。React`localhost:8000`でGoは`localhost:8080`で動いているとします。

ReactからGoへリクエストを投げてみます。すると次のエラーが出ます。

![Screen Shot 2022-10-30 at 14.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949101/ccbf9810-613e-af38-f4ea-1fc6c2ce0eaa.png)

# オリジンが異なるときはCORSの設定が必要

エラーの原因はReactとGoでオリジンが違うことです。今回の場合で言うと

React:http://localhost:8000
Go:http://localhost:8080

がオリジンです。

違うオリジンにリクエストを送るにはCORS(Cross-Origin Resource Sharing)の設定が必要で

元記事を表示

「Go言語でつくるインタプリタ」の実行環境構築 M1 Mac

「Go言語でつくるインタプリタ」のサイトからソースコードをダウンロードし、Goのコンパイラをインストールし、コンパイルしようとしたら

“`terminal:terminal src/monkey/
$ go run main.go
main.go:5:2: package monkey/repl is not in GOROOT (/opt/homebrew/Cellar/go/1.19.2/libexec/src/monkey/repl)
“`
とエラーが返ってきてつまずいたので解決法を記事にしました。
# 環境
* macOS Monterey
* Apple Silicon(M1)
* Homebrew 3.6.7

# 目標
「Go言語でつくるインタプリタ」のソースコードのコンパイル、実行ができるようにする。具体的には
“`terminal:src/monkey/
$ go run main.go
Hello {username}! This is the Monkey programming language!
Feel free to type in command

元記事を表示

migrate用のコンテナを作成

## 環境
・Go
・MYSQL8.0
・Docker
## SQLファイルをDBに入れる

SQLファイルを一度読み取り、“;“区切ってfor文で順番に入れた。
“`go:main.go
package main

import (
“database/sql”
“io/ioutil”
“log”
“strings”

_ “github.com/go-sql-driver/mysql”
)

const (
path = “root:password@tcp(mysql:3306)/kartenspielen”)
var (
count = 0
)

func main() {
db, err := sql.Open(“mysql”, path);if err != nil {
log.Println(err)
return
}
c, ioErr := ioutil.ReadFile(“./init.sql”)
if ioErr != nil {
log.Println(ioErr)
}
requests := strings.Spl

元記事を表示

[Go]gRPCの概要をつかむ

来月からgRPCでのAPI開発をすることになっているので、事前に学習した成果をまとめた。
この記事は以下の構成になっている(あとから見返して思い出しやすいように)。

– gRPCのイメージを座学的にざっくり → 詳細につかむ
– gRPC APIのサンプルを実際に動かしてみることで、イメージより強固にする

# 1. ざっくり理解
## 1.1. gRPC
REST APIの対抗馬となる**APIのフレームワーク的なもの**。
対比させると下記のような形。

項目|REST API|gRPC
—|—|—
HTTPプロトコル|HTTP/1.1|HTTP/2
メッセージのフォーマット|JSON や XML(テキスト)|Protocol Buffers(バイナリ)
コードの自動生成|サードパーティ製ツール(Swaggerなど)|Protocol Buffers(※protoc + gRPC拡張プラグイン)
リクエスト実行| <エンドポイントURL> (例. GET /user/1)|gRPCスタブ(内部的にはProtocol Buffers形式へのシリアライ

元記事を表示

【シンプルかつ即戦力!】Go言語 / sqlcの使い方!

今回はGo言語におけるORMツールの一つである __sqlc__ を紹介します!

以前までGo言語のORMといえば、私の中では __GORM__ 一択という印象だったのですが、
たまたま触る機会があり、sqlcを使ってみるとGORMとはまた違ったメリットや使いやすいと感じた点もあったので、今回の記事でまとめていきたいと思います。

# sqlcの概要

前述の通り、Go言語で使えるORM(ORマッパー)の一つがsqlcです。

GORMはRubyのActive Recordに近い感覚で使えるのに対して、sqlcはSQLで書かれたクエリを自分で用意したうえで、それを元にGo言語のクエリ用のコードを自動生成してくれます。

実行するSQLを事前に書かないといけないという手間は発生しますが、ORマッパーならではの「裏でどんなクエリが飛んでるか分からない」といったことが発生しないために、パフォーマンスの調整がしやすいのが嬉しいところですね。

一方で、現時点でGORMに比べて劣っている点として下記の2点が挙げられます。

1. DBのマイグレーションはスコープ外のため、golang-migr

元記事を表示

GolangでLastInsertId is not supported by this driver が発生する話

## LastInsertId is not supported by this driver が発生
GoでDB操作のAPIを作成しているときに出会ったエラー

“`Go
func (ur userRepository) CreateUser(ctx context.Context, user *entity.User) (*entity.User, error) {
statement := “INSERT INTO users (name,mail) VALUES($1,$2)”
stmt, err := ur.db.Prepare(statement)
if err != nil {
log.Println(err)
return nil, db_error.StatementError
}
defer stmt.Close()

res, err := stmt.ExecContext(ctx, user.Name, user.Mail)

if err != nil {
log.Println(err)
return nil, db_erro

元記事を表示

GoでGeocoding APIを使う方法

## Geocoding API のレスポンス

“`json:geocoding.json
{
“results”: [
{
“address_components”: [
{
“long_name”: “1600”,
“short_name”: “1600”,
“types”: [
“street_number”
]
},
{
“long_name”: “Amphitheatre Parkway”,
“short_name”: “Amphitheatre Pkwy”,
“types”: [

元記事を表示

RaspberryPiでGolang(cgo)でNEONを動かす

# RaspberryPiでGolang(cgo)でNEONを動かす
## 動機
raspberry pi コンピュータリソースの最大使用に向けて。

## 機材
Raspberry Pi4 4GB
go version go1.11.6 linux/arm
gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1)

## 元プログラム
neonとかについては[こちらから](https://qiita.com/Soleiyu/items/3e80975f00dd700f563b)

“`test1.cpp
1 #include
2 #include
3
4 using namespace std;
5
6 int main () {
7
8 cout << "hoge" << endl; 9 10 int array1[2] = {31, 22}; 11 int array2[2] = {11, 20}; 12 int arrayAns[2];

元記事を表示

entで作成日時と更新日時のフィールドにはmixin.Timeを使うといいかも

ビルトインで用意されている簡単なやつだけど `create_time` と `update_time` くらいだけでよければ便利。

ミクスインしてやればいいだけなので楽。
“`go
func (User) Mixin() []ent.Mixin {
return []ent.Mixin{
mixin.Time{},
}
}
“`
実装は以下のような感じっぽい。
“`go
// CreateTime adds created at time field.
type CreateTime struct{ Schema }

// Fields of the create time mixin.
func (CreateTime) Fields() []ent.Field {
return []ent.Field{
field.Time(“create_time”).
Default(time.Now).
Immutable(),
}
}

// create time mixin must implement `Mixin` interface.
var

元記事を表示

Go言語入門 学習メモ 11 ゴールーチン、チャネル、select、

# はじめに
船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。

# 対象読者
– これからGo言語を学習する方
– 既に他の言語で基本構文を学習されている方

# 学習環境
学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。
– Windows 11 Home / 22H2
– VSCode / 1.72.2
– go version go1.19.2 windows/amd64
– git version 2.38.0.windows.1

https://qiita.com/fsd-osw/items/0e569b0b828455cdef9e

# 前回までの学習
前回は io.Readerインタフェース を学習しました。

https://qiita.com/drafts/41f9a3dcdfe9c749718b/edit

# ゴールーチン
Goのランタイムで管理される並行処理を行うための軽量スレッド[^thread

元記事を表示

Go言語入門 学習メモ 10 io.Readerインタフェース

# はじめに
船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。

# 対象読者
– これからGo言語を学習する方
– 既に他の言語で基本構文を学習されている方

# 学習環境
学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。
– Windows 11 Home / 22H2
– VSCode / 1.72.2
– go version go1.19.2 windows/amd64
– git version 2.38.0.windows.1

https://qiita.com/fsd-osw/items/0e569b0b828455cdef9e

# 前回までの学習
前回は Stringerインタフェース、Errorインタフェース を学習しました。

https://qiita.com/fsd-osw/items/8d21babcd2f3b644b976

# io.Readerインタフェース
io.Readerインタフェ

元記事を表示

Atlas APIにおけるMigrationモード

どういう違いがあるのか、ドキュメントに書かれていないように見えたがコードを見ると書いてあった。

https://github.com/ent/ent/blob/5330f877593201a1538884944f1783b104c6fbc4/dialect/sql/schema/atlas.go#L555-L563
“`go
// Mode to compute the current state.
type Mode uint

const (
// ModeReplay computes the current state by replaying the migration directory on the connected database.
ModeReplay = iota
// ModeInspect computes the current state by inspecting the connected database.
ModeInspect
)
“`

`ModeReplay` は生成されたマイグレーションのDDLから差分を計算してして新しいマ

元記事を表示

Herokuの代替としてFly.ioを使ってみた話

– [はじめに](#はじめに)
– [Fly.ioを選んだ理由](#flyioを選んだ理由)
– [手順](#手順)
– [その1 flyctlのインストール](#その1flyctlのインストール)
– [その2 サインアップ & サインイン](#その2サインアップ–サインイン)
– [その3 アプリをFly上にラウンチ](#その3アプリをfly上にラウンチ)
– [チュートリアルやってみる](#チュートリアルやってみる)
– [fly.toml 内容](#flytoml-内容)
– [まとめ](#まとめ)
– [参考文献](#参考文献)

# はじめに
カリルー(仮題)という個人間でのもののシェアの予約・金額計算を行うアプリを開発しようとしています。もうすぐ公開!(進捗90%位?)といったところで、Herokuの無料プランが終了するという連絡がきたので代替を試しがてら、メモとして記事を書いてます。

がっつりHerokuを使ってた人じゃなくて、Webアプリ開発学習中という人向けの内容になります。

作ろうとしていたアプリは、Golangのginテ

元記事を表示

GoのgRPCサーバーでトランザクション

`database/sql`を使ってtransactionを行ったのでメモ。
## 環境
* Go 1.19
* MYSQL8.0
* gRPC
## SQL
使用するSQLは下記の通り。
“`sql:init.sql
BEGIN;
SELECT * FROM player WHERE id = ? FOR UPDATE;
INSERT `table` (`key`, title, gameId, adminId, `limit`, `start`, extraFields) VALUES(“vfdsaa”, “Hello”, 1, 1, 3, 0, {“turn”: “”});
UPDATE player SET tableId = ? WHERE id = ?;
ROLLBACK;
COMMIT;
“`
ユーザーがルームを作成するという内容である。ユーザーが既にどこかのルームに所属している場合、作成はできない。

## トランザクション
`database/sql`でトランザクションを行う場合、下記のメソッドを使用する。
“`go:repository.go
import (

元記事を表示

OTHERカテゴリの最新記事