Go関連のことを調べてみた

Go関連のことを調べてみた

Go言語とC++で演算子の優先度が違ってバグった話

# GoからC++への移植
最近、C++の練習がてらAtCoderなどの競技プログラムをC++でもやり始めました。基本Go言語でやっているので、Go言語でプログラミングしてACしたあとに、C++に移植というスタイルでやっています。

Go言語からC++にポーティングする時に、演算子の優先度でバグったので情報共有しておきます。

# バグったコード

具体的には、以下の式です

“`go
bit = x >> i % 2
“`

この結果がC++とGoで異なり、どこでミスが発生しているのかを見つけるのにえらく苦労しました(まさか、ここの挙動が違うとは思いもしませんでした)。

# 実際に確認してみる

## Go言語

“`go
package main

import “fmt”

func main() {
x := 0x55

for i := 0; i < 8; i++ { fmt.Println(i, x>>i%2, (x>>i)%2, x>>(i%2))
}
}
“`

上記のプログラムの実行結果は、以下になります
“`text
0 1 1 85
1 0

元記事を表示

GO言語でpingを実行するプログラムの作り方

# はじめに

GO言語で開発するプログラムの中でpingを実行して疎通確認をしたい場合があると思います。そのためのパッケージの紹介です。

https://github.com/prometheus-community/pro-bing

を使います。go-pingというパッケージがありますが、今はメンテナンスされていません。検索して見つかっても使わないほうがよいです。

# PINGを実行するプログラム

“www.google.com”へpingするプログラムは

“`go
package main

import (
“log”

probing “github.com/prometheus-community/pro-bing”
)

func main() {
pinger, err := probing.NewPinger(“www.google.com”)
if err != nil {
log.Fatalln(err)
}
pinger.Count = 3
// pinger.SetPrivileged(true) // for Windo

元記事を表示

【Go言語】 型アサーション

# 前回までのあらすじ
第2回目は「クロージャー」について学びました。もしよかったらご覧ください。

https://qiita.com/koutorino/items/42fbec48b8f39ecee017

今回も引き続きUdemyの『【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』の内容をもとに学習を進めていきます。

https://www.udemy.com/course/golang-webgosql/?couponCode=ST11MT91624B

# 型アサーションとは
インターフェース型の変数が具体的な型に保持している値を取得するための機能のことです。
インターフェース型は異なる型の値を扱うことができるため、なんの型が入っているかがわかりにくくなります。そこで、型アサーションを使うとインターフェースの内部にある具体的な値の型を確認・取得できます。
“`golang
value := x.(T)

x: インターフェース型の変数
T: 具体的な型(例えば、intやstringなど)
“`

上記が

元記事を表示

個人的に感じたMVCアーキテクチャとレイヤードアーキテクチャの違いについて

## はじめに
初めまして。私は新卒2年目のエンジニアで、これまでに2つのプロジェクトに携わりました。1つ目のプロジェクトはMVCアーキテクチャを採用し、2つ目はドメイン駆動設計(DDD)とレイヤードアーキテクチャに基づいて開発を行いました。

この記事では、これら2つのアーキテクチャの比較を、私自身の経験を基に説明します。まだ経験が浅い部分もありますが、意見やフィードバックをいただけると嬉しいです。

## それぞれのメリット、デメリットについて
| | 学習コスト | 開発スピード | 責務の分離 |
| ———————— | ———- | ——————– | ———————————— |
| MVC | 比較的低い | 小〜中規模だと早い | チームで決めておかないと不明瞭になる |
| レイヤー

元記事を表示

【Go言語】 クロージャー

# 前回までのあらすじ
第1回目は「型ごとの特徴」について学びました。もしよかったらご覧ください。

https://qiita.com/koutorino/items/84b4895ff35f86d1d2f4

今回も引き続きUdemyの『【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』の内容をもとに学習を進めていきます。

https://www.udemy.com/course/golang-webgosql/?couponCode=ST11MT91624B

# クロージャーとは
wikiでクロージャーを調べると以下のような説明がありました。

>関数閉包はプログラミング言語における関数オブジェクトの一種。いくつかの言語ではラムダ式や無名関数にて利用>可能な機能・概念である。引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において>解決することを特徴とする。関数とそれを評価する環境のペアであるともいえる。

ちょっと何を言っているのかわからないですが、簡単にいうと関数の外で定義された変

元記事を表示

【GO言語】 型ごとの特徴

# Go言語を学ぶ。
業務でGo言語が必要になってきたので、Go言語のアウトプットをこれからしていこうと思います。
超絶基礎的なところから始めて、アウトプットが必要だと感じた項目について記事にしていきます。
今回Udemyの『【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』の内容をもとに学習を進めていきます。
少しお金がかかりますが、私が書いていることよりも詳しく説明されていますので、ぜひこちら購入して学習してみてください。

https://www.udemy.com/course/golang-webgosql/?couponCode=ST11MT91624B

# 型ごとの特徴
型ごとに細かな特徴があるので特徴をまとめました。

## int型
– 表現方法
“`golang
//明示的
var i int = 100

//暗黙的
i := 100
“`

### int型の種類

| 型 | サイズ | 範囲 |
|–

元記事を表示

【GORM】Modelメソッドにはポインタ型の構造体を渡そう

一般的にCRUDする分には、Modelメソッドに値型の構造体を渡しても動作はします。
“`go
if err := db.Debug().
Model(User{}).
Where(“id = ?”, 1).
Updates(User{Age: 30}).Error; err != nil {
fmt.Println(“error:”, err)
}
“`
## 発生するエラー
しかし、Hooksを設定している状態で、Modelメソッドに値型の構造体を渡すと、以下のようなエラーが出力されます。
“`
invalid value, should be pointer to struct or slice
“`

## Hooksとは
特定のテーブルに対して作成、取得、更新、削除の操作を行う前後に自動的に呼び出される関数のことです。
参考: https://gorm.io/ja_JP/docs/hooks.html

## エラーが発生するコード例
“`go
func dbInit() *gorm.DB {
dsn := “root:@tcp(127.

元記事を表示

GO言語のgo-echartsパッケージを使って横棒グラフを出力する方法

# はじめに

go-echarts

https://github.com/go-echarts/go-echarts

を使ってチャートを出力するシリーズの3つ目の記事です。

1つ目は、

https://qiita.com/twsnmp/items/c0bb1b6b8dd18132dfb6

です。

今回は、横棒グラフの出力方法です。

go-echartsのGitHubにあるサンプルプログラムを、そのまま実行すると縦棒グラフ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874862/56afe1c8-e94b-ed4d-9f37-d95c87e78bd9.png)

が表示されます。

これを1行追加するだけで、横棒グラフにできるという、お話です。

# 横棒グラフの出力

横棒グラフは、

“`go
package main

import (
“math/rand”
“os”

“github.com/go-echarts/go-echarts/v2/c

元記事を表示

Firebase Authentication でユーザー認証 & バックエンドにもユーザー登録(統合)

## はじめに
こんにちは!今回は、Webアプリケーションにおけるユーザー認証について、私が取り組んだ「Firebase Authentication」の実装方法を共有したいと思います。

Firebase Authenticationは、手軽に導入できる認証サービスとして多くの開発者に利用されています。特に、バックエンドと連携してデータベースにユーザー情報を登録・管理できる点が便利です。

この記事では、以下の内容をカバーします。

– Firebase Authenticationの概要
– Firebaseによる認証の実装方法
– FirebaseUIDを使用したバックエンドとの統合

ぜひ、実際のプロジェクトに役立ててください。

基本的な説明は[公式ドキュメント](https://firebase.google.com/docs/auth?hl=ja)に任せます。この記事では、バックエンドとの統合のための実装がメインですので、Firebase Authenticationへの登録方法等はリンクをご覧ください。🙇

## 目次
– [Firebase Authenticatio

元記事を表示

UUIDとは?GoでUUIDを生成する

## UUIDとは?
UUIDとはUniversally Unique Identifierの略で、**一意に情報を識別するための識別子**です。

フォーマットも定められています。
– 16進数形式: 32桁の16進数(数字とアルファベット)
– ハイフンで区切られた形式: 8桁-4桁-4桁-4桁-12桁、合計で36文字(32桁の16進数と4つのハイフン)

例)123e4567-e89b-12d3-a456-426614174000

以上を満たすような文字列をUUIDとし、**事実上世界中で重複しない**ためユニークなIDとして扱うことができます。

UUIDとUIDの違いは、**グローバルで一意であるのがUUID、特定のシステムで一意であるのがUID**です。

## バージョンとは?
UUIDには、**生成方法が異なる複数のバージョン**があり、**v1からv8**まで存在します。その中でも、おそらく一番多く使われているのはv4です。v4はランダムなUUIDを生成したい場合に一般的に利用されます。**用途に応じて適切なバージョンを選定することが望ましい**ですが、本記事では各

元記事を表示

Go言語(Golang)のRestAPIの基本(CRUD操作、認証)

### 基本構造

1. **プロジェクトのセットアップ**
– Goモジュールの初期化
“`bash
go mod init example.com/myapi
“`

### メインファイルの作成

以下は、標準ライブラリのみを使った簡単なCRUD操作を含むRestAPIの例です。

“`go
package main

import (
“encoding/json”
“fmt”
“net/http”
“strconv”
“strings”
)

type Item struct {
ID int `json:”id”`
Name string `json:”name”`
}

var items []Item

func main() {
http.HandleFunc(“/items”, itemsHandler)
http.HandleFunc(“/items/”, itemHandler)

fmt.Println(“Server liste

元記事を表示

Go の ORM sqlcでBulk Insertを行う(MySQL)

sqlcでは動的なSQLは書けません。[WHEREについては方法を紹介しました](https://qiita.com/ktat/items/ddf0e5e510279503feee)が、Bulk Insertも動的になってしまうので、困りますね。
SELECTと同様、Query Builderで作るのも手段ではありますが、一応公式に用意されています。ただ、ちょっと微妙かなと思っています。

## copyfrom アノテーションを使う

下記のように`copyfrom`を使うのが、[公式のやり方](https://docs.sqlc.dev/en/stable/howto/insert.html#mysql)です。

“`sql
— name: InsertValues :copyfrom
INSERT INTO
user (id, Name)
VALUES
(?, ?);
“`

ただ、これ、実際は、`INSERT`ではなくて`LOAD DATA`に変換されます。`LOAD DATA`に変換されると、懸念事項がいくつかあります。
ただ、`LOAD DATA`のパ

元記事を表示

GO言語のgo-echartsパッケージを使ってヒートマップを出力する方法

# はじめに

go-echarts

https://github.com/go-echarts/go-echarts

を使ってチャートを出力するシリーズの2つ目の記事です。

1つ目は、

https://qiita.com/twsnmp/items/c0bb1b6b8dd18132dfb6

です。

今回は、曜日と時間帯ごとのデータの量を色で表現するヒートマップを出力する方法です。数値が多いところを赤く表示し少ないところを青系にするようなチャートです。

# ヒートマップの出力

ヒートマップは、

“`go
package main

import (
“os”

“github.com/go-echarts/go-echarts/v2/charts”
“github.com/go-echarts/go-echarts/v2/opts”
)

var (
hmData = [][3]int{
{0, 0, 5}, {0, 1, 1}, {0, 2, 0}, {0, 3, 0}, {0, 4, 0}, {0, 5, 0},
{0, 6, 0}, {0,

元記事を表示

GoとNext.jsでQiitaのような記事投稿サービスの実装してみた

# 概要

現在GoとNext.jsを勉強しており、その一環でQiitaのような記事を投稿サービスを開発しています。

QiitaやGithubなどマークダウンでコンテンツを保存する機能があるサービスを参考に、自分なりにロジックを考えて実装してみたのでメモとしてまとめてみます。

詳細に書くと内容が多くなってしまいます。
簡略化して書いている部分や具体的なコードは省略して、基本的にはロジックをメインに記載させていただきます。🙇

※ Qiitaをリバースエンジニアリングして忠実に再現したわけではなく、動作を同じにすることを重視しており、ロジックは開発コストを抑えるために簡易的に実装しており考慮できていない部分もある可能性がありますので、そういった部分はコメントで教えていただけると幸いです。

# 仕様
### システムアーキテクト
構成は鬼シンプルで、できるだけalways freeで使用が可能なGCPサービスを使っています。
CloudSQLだけ月1300円ほどかかってしまっています。🥲
理由としては、以下の2点です。
– これから記事投稿以外にも色々機能を追加する予定のため、今後扱

元記事を表示

Go | データ変換から見るsamber/loのチートシート

この記事は 下記の観点による個人的な[samber/lo](https://github.com/samber/lo)のチートシートになります。

– `A → B` というデータ変換の観点で整理
– 個人的によく使うヘルパーだけに絞ってる
– 別パッケージで同一のものがあればまとめる

## 背景

Go Way では愚直に for文を回すことが美徳とされるが、モダン言語経験者からすると高階関数やヘルパーが欲しくなることが多いと思う(個人的感想)。

built-inでもヘルパーが増えてきているが機能的にまだまだ足りていないし、意図的に弾かれてしまってるものもある。

– [samber/lo](https://github.com/samber/lo)
– [x/exp/slices](https://pkg.go.dev/golang.org/x/exp/slices)
– [x/exp/maps](https://pkg.go.dev/maps)

それなら、じゃあ [samber/lo](https://github.com/samber/lo) を使おうと思うわけなのだ

元記事を表示

GO言語ORMによるデータベース操作(jinzhu)によるDBスコープエラー

※初心者のため、間違いや何かご存じの方がいましたら、教えていただけると助かります。

# 概要
以下のサイトに従って、ginによる認証を実装をしていたところ、
「サインアップ」エンドポイント ユーザー情報登録の項目で、POSTしたら、以下の 500 Internal Server Errorが発生した。

https://go.genzouw.com/2023/03/31/post-331/

main.goは以下
“`go
package main

import (
“jwt-gin/controllers”
“jwt-gin/models”

“github.com/gin-gonic/gin”
)

func main(){
models.ConnectDataBase()

router := gin.Default()

public := router.Group(“/api”)

public.POST(“/register”, controllers.Register)

router.Run(“:8080”)
}
“`

setup.goは以下

元記事を表示

Go言語(Golang)ポインタを使うべき時と、使うべきでない時

### ポインタを使うべき時

1. **データの変更が必要な場合**:
– 関数やメソッド内で引数のデータを変更したいとき

2. **大きなデータ構造**:
– 大きなデータを関数に渡すときに、コピーを避けてメモリを節約したいとき

3. **共有する必要がある場合**:
– 複数の関数やメソッドで同じデータを扱いたいとき

4. **nil チェックの必要がある場合**:
– 値が存在しないことを示すために `nil` を使いたいとき

#### 例:データを変更する関数

“`main.go
package main

import “fmt”

type User struct {
Name string
}

func UpdateName(user *User, newName string) {
user.Name = newName
}

func main() {
user := User{Name: “Alice”}
fmt.Println(“Before:”, user.Name)

Up

元記事を表示

GO言語のgo-echartsパッケージを使って時系列チャートを出力する方法

# はじめに

GO言語で開発したプログラムから、ちょっとしたチャート(グラフ)を出力する時にgo-echartsというパッケージが便利です。

https://github.com/go-echarts/go-echarts

しかし、サンプルプログラムが少ないのでグラフを出力するためのデータ構造がわかりにくいです。そこで、誰かのためになればと思って解説の記事を書いてみました。

# go-echartsについて

go-echartsは、JavaScriptのチャートライブラリApache ECharts

https://echarts.apache.org/en/index.html

を使ったインターラクティブなチャートを含むHTMLファイルをGO言語から出力するものです。このライブラリのサンプル

https://echarts.apache.org/examples/en/index.html

にあるようなチャートの一部を出力できます。チャートを出力するための設定やデータは、JavaScript版と同じように考えればよいと思います。

go-echartsのサンプルは、

元記事を表示

ユースケースから考えるgoroutine

## はじめに
突然ですが、goroutineを扱うのって難しくないですか?
処理が並行で走るので、「データ競合大丈夫なのか?」「このchannelどの関数で使われてるんだっけ?」など、いろいろ把握するのが大変だなと思っています。そのためgoroutineはできるだけ使わないようにしています。ただ、それでも使わざるを得ない場面が出てくるのは事実です。
そこで今回は、goroutineを使うべきユースケースについて考えてみようと思います。要件によってどのように使っていくのかを見ていこうと思います。この記事はあくまで私僕の個人的な意見モリモリな内容ですので、1個人のエッセイというかポエムとして気軽に楽しんでいただければ!

## ユースケース
今回はバッチ処理について考えてみましょう。

> サービスAから定期的に顧客情報を取得し、自社のDBに反映させたい。

![usecase1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/d56bf604-9ea7-43f8-bd35-e415bc02

元記事を表示

Gin/Go言語(Golang)のReatAPIの基本(飲食店情報サイトでの具体例)

## ソースコード

#### 1. プロジェクト構造
“`
restaurant-api/
├── main.go
├── models/
│ ├── user.go
│ └── restaurant.go
├── handlers/
│ ├── user_handler.go
│ └── restaurant_handler.go
├── middleware/
│ └── auth_middleware.go
└── database/
└── database.go
“`

#### 2. データベース接続の設定

“`database/database.go
package database

import (
“log”

“gorm.io/driver/sqlite”
“gorm.io/gorm”
)

var DB *gorm.DB

func ConnectDatabas

元記事を表示

OTHERカテゴリの最新記事