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

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

[Golang]APIのバージョン管理

“`go:main.go
package main

import (
“fmt”

“github.com/gin-gonic/gin”
“example/webapp/api/v1”
)

r := gin.Default()

func main() {
r := gin.Default()
v1.GroupRouter(r)

r.Run()

}
“`

“`go:urls.go

package v1

import (
“fmt”
“github.com/gin-gonic/gin”

)

func ApiTemp(router *gin.RouterGroup) {
router.GET(“/ping”, func(c *gin.Context) {
// queryparamerの値を取得する
// fmt.Println(c.Query(“samplequery”))
c.JSON(200, gin.H{
“Message”: “v1 ping healthcheck”,
})
})
}

func

元記事を表示

3分でAWS Lambda Function URLをSAM使ってデプロイする

## これは何

[SAM(Serverless Application Model)](https://aws.amazon.com/jp/serverless/sam/) を使って関数URLを設定したLambdaをデプロイします。
関数URLだけ使いたい(APIGatewayは使いたくない)というケースでテンプレの参考になればと思いました。
内容は比較的薄いです。

経緯

10000000年程前にAWS Lambda Function URLが提供されました。[記事](https://aws.amazon.com/jp/blogs/news/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/)
これはLambdaをHTTPで直接起動できる機能です。

今まではAPI Gatewayを経由しないといけなかったのですがLambda単体でできるようになって便利になりました。こ

元記事を表示

cobraでヘルプをグループ化する機能が追加されたので試してみる

### 目的

cobraでヘルプをグループ化する機能が追加されたので試してみる

### 環境

– spf13/cobra 1.6以上
– go言語 バージョン 1.19

### グループ化してみる

コマンドにグループを追加する。追加順にグループが表示されます。
“`golang
rootCmd.AddGroup(&cobra.Group{ID: “group1”, Title: “group1”})
rootCmd.AddGroup(&cobra.Group{ID: “group2”, Title: “group2”})
“`

グループ化したいサブコマンドにグループIDを付与する
“`golang
var subCmd1 = &cobra.Command{
Use: “sub1”,
Long: “sub1 command”,
GroupID: “group1”,
}
“`

helpやcompletionをグループに含めるには`SetHelpCommandGroupID`と`SetCompletionCommandGroupID`を使う
※r

元記事を表示

GoオンリーでGUI上からQRコード読み取りをしてみた

# はじめに
Goで使えるOpenCV, [GoCV](https://gocv.io)を使ったリアルタイムのQRコードのスキャンをGUIアプリ実現する[therecipe/qt](https://github.com/therecipe/qt)内で実装したので備忘録として残そうと思います.

## 前提条件
– Go, OpenCVがインストール済みであること
– Webカメラが用意されていること
## 環境
– OS: macOS 13 Ventura
– Go 1.19
– OpenCV 4.6.0
– GoCV v0.31.0
– therecipe/qt v0.0.0-20200904063919-c0c124a5770d
– [gozbar](https://github.com/MordFustang21/gozbar) v0.0.0-20191118235142-b46f682b2cab

# インストール
## GoCV
“`zsh
go get -u -d gocv.io/x/gocv
“`
さらに, pkgconfigにOpenCVのパスを通す必要があるので

元記事を表示

[Golang]Requests

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

## GetのAPIを作成

“`go
func SampleGetAPI(router *gin.RouterGroup) {
router.GET(“/ping”, func(c *gin.Context) {
// queryparamerの値を取得する
fmt.Println(c.Query(“samplequery”))
c.JSON(200, gin.H{
“Message”: “pong”,
})
})
}

“`

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

“`go
func 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

元記事を表示

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

# package monkey/repl is not in GOROOT
「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

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事