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

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

GoによるAPIエラーの返却

## はじめに
GoによるAPIエラーの返却について説明したい。

## そもそも何をエラーとして何を返却するか
参考にさせていただいたAPIエラーの返却内容
https://qiita.com/suin/items/f7ac4de914e9f3f35884

こちらを参考にすると、code,messageは入れておくのが定石みたいですね。エラー内容がわからなくなるので当然かと思います。ほかはサービスによって異なりますね。
個人的にはどこにアクセスしたかを知れるとデバッグで助かるので、urlは欲しいと思います。

## 実際にコードを見てみよう
下記は上の内容を踏まえて作成した、APIエラーを返却する1例です。

“`
return func(w http.ResponseWriter, req *http.Request){
if err != nil {
apiError, _ := json.Marshal(map[string]interface{}{
“code”: http.Status…,

元記事を表示

Goによるlocale(言語と地域の設定)の取得

## はじめに
多言語対応などのために、Goによるlocale(言語と地域の設定)の取得方法の一例を記載します。
## 要点
#### Request HeaderのAccept-Languageを取得する。
#### HeaderになかったらSessionの中身を取得する。(既に設定しているかもしれない)
#### 一切設定されていないならデフォルト値を設定する。
## 実際にコードを見てみよう
“`
func GetLocale(w http.ResponseWriter, req *http.Request) (locale string){
locale := req.Header.Get(“Accept-Language”)
session := sessions.GetSession(req)
default := “en-us”

if locale == “” {
l := session.Get(“locale”)
if l == nil {
lo

元記事を表示

【Go】ポリシーに則ったランダムパスワード文字列の生成

– Go でランダム文字列を生成するには crypt/rand などの乱数生成器を使う方法がある
– https://qiita.com/nakaryooo/items/7d269525a288c4b3ecda
– 加えて、パスワードなどの平文を生成する際に、「**英大文字、小文字、数字が必ず一つ以上含まれていること**」などのポリシーに則った文字列を生成したい時がある
– そんな時用のスニペット

“`main.go
package main

import (
“crypto/rand”
“fmt”
“math/big”
)

func main() {
pp, _ := newPlainPassword(16)
fmt.Println(pp)
}

func newPlainPassword(length int) (string, error) {
const (
uppercaseCharset = “ABCDEFGHIJKLMNOPQRSTUVWXYZ”
lowercaseCharset = “abcdefghijklmnopqrstuvwxy

元記事を表示

家族向け書籍管理アプリの作成②(GoでバックエンドAPI)

## はじめに

前回の記事では、家族向け書籍管理アプリのフロントエンドの環境構築と、GoogleBooksAPIを使用して書籍情報を検索する機能を実装しました。

今回は、Golangを利用してバックエンドAPIを作成します。バックエンドAPIでは、書籍の登録、検索、更新、削除などの機能を提供します。

## プロジェクトの概要

このアプリケーションは、家族全員の書籍を一元管理するためのものです。GoogleBooksAPIを使用して書籍情報を検索し、各書籍の紙媒体と電子媒体の所有状況、読了状況などを管理します。

最終的には、Flutterを使用してモバイルアプリケーションを作成し、バーコードをスキャンして書籍を登録できるようにする予定です。

## 必要な環境

– Docker Desktop
– Visual Studio Code
– Remote Development(拡張機能)

## 技術スタック

このプロジェクトで使用した主な技術は以下の通りです:

– Docker: アプリケーションとその依存関係をコンテナとしてパッケージ化し、どの環境でも同じように動

元記事を表示

Goで学ぶGraphQLサーバーサイド(13)ーGraphQLサーバーのテスト

こんにちは。

皆さん、あけましておめでとうございます!

今回は「GraphQLサーバーのテスト」について説明していきます。

# この章について

品質の良いコードを作るためには、テストを書いて実行することがとても重要です。
ここからは、`gqlgen`で作ったGraphQLサーバーをテストするために便利なライブラリ・Tipsを紹介します。

# サービス層のテスト

## 考えられるテスト手法

サービス層は`sql.DB`構造体を用いてDBからデータを取得する処理を実装しています。
そのため、ここのテストをするためには

– テスト用のDBを立てて、そこに向き先を変えてテストを実行する
– sql.DB構造体をモックに差し替える

という2つの方法が考えられます。
1つ目の方法は、テストの実行前後にDBの起動・終了処理を挟んだり、DBの中にテスト用データを入れる前処理が必要になるため少々面倒です。
そのため、[github.com/DATA-DOG/go-sqlmock](https://pkg.go.dev/github.com/DATA-DOG/go-sqlmock)パッケ

元記事を表示

Goで構造体へのポインタをデリファレンスした変数の扱いに関して

## 概要
Go言語において、構造体へのポインタをデリファレンスして得られた値を新しい変数に格納すると、その変数は元の構造体のデータのコピーになるということを知ったので備忘録のため投稿します

## 実例
下記を見ると、構造体へのポインタをデリファレンスした`copiedPerson`を変更しても`originalPerson`の値が変わらないことが分かります。
“`go
package main

import “fmt”

type Person struct {
firstName string
lastName string
}

func main() {
originalPerson := &Person{“Taro”, “Yamada”}
fmt.Println(originalPerson) // &{Taro Yamada}

// 構造体のフィールドを変更します。
originalPerson.firstName = “太郎”
originalPerson.lastName = “山田”
fmt.Println(originalPerson) /

元記事を表示

[Go言語] ポインタの使い方メモ

## ポインタ
ポインタとかアドレスとか調べてわかった気にはなったけど実際のコード見てもよくわからん!!となったので自分なりに簡単にメモします。

## 使用例
“`golang
type Server struct {
srv *http.Server
l net.Listener
}

func NewServer(l net.Listener, mux http.Handler) *Server {
return &Server{
srv: &http.Server{Handler: mux},
l: l,
}
}
“`
例えばこういうNewなんちゃらで新しい構造体を生成する関数をよく見ます。

## Server構造体
`Server`構造体の`srv`にはポインタが使われていて、`l`には使われていません。
理由は`http.Server`は
“`golang
type Server struct {
Addr string
Handler Handler
// 以下略
}
“`
というような構造体なのに対して、`net

元記事を表示

sago35/tinygo-keyboard を用いて自作キーボードを作ろう

この記事では TinyGo + Wio Terminal を用いて sago35/tinygo-keyboard を使った自作キーボードを作るための情報をまとめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63649/a22afd85-8f64-5e91-5f1d-55006087addd.png)

sago35/tinygo-keyboard は TinyGo で自作キーボードを作るための package です。レイヤー対応や各種スイッチ読み取り方式への対応、 Vial 対応等が含まれます。

https://github.com/sago35/tinygo-keyboard

## 前提知識

以下の書籍 「基礎から学ぶ TinyGoの組込み開発」を読んでおくとスムーズです。
※[電子書籍は 2024/01/22 まで 40% オフで購入](https://book.mynavi.jp/manatee/books/detail/id=134168)することができます

h

元記事を表示

Goのfor-rangeのkeyはコピーであることが分かった

## 概要
Goのfor-rangeで渡される第2引数はコピーであることが分かったので投稿します。

Go: 1.21
## 実例
以下の例だと、`for i, v := range people`のvの値はpeopleの1つ目の要素のコピーなので、vの値を変えても、大元のpeoleの値は変更されません。
コピーなので`fmt.Println(&people[i] == &v)`のメモリアドレスの比較でもfalseになります。

“`go
package main

import (
“fmt”
)

type person struct {
name string
}

func main() {
people := []person{
{name: “aだよ”},
}

for i, v := range people {
fmt.Println(&people[i] == &v) // false
v.name = “名前変わったよ”
fmt.Println(v.F()) // 名前変わったよ
}
fmt.Println(people) // [{

元記事を表示

[Go言語]簡単なWebサーバの立て方(ListenAndServe関数)

今回は初心者向けにGo言語において超簡単なWebサーバを実装します。最終的なコードは最後に載せているので、それだけ見たい方は下まで飛ばしてください!

# ListenAndServe関数
`http.ListenAndServe`関数を用いることでサーバを起動することができます。
“`golang
http.ListenAndServe(“:8080”, nil)
“`
`http.ListenAndServe`の中身を見てみましょう。VSCodeであれば`fn+F12`で関数の定義に飛ぶことができます。もちろん、[Github](https://github.com/golang/go/blob/master/src/net/http/server.go#L3172)でも確認できます。
“`golang
// ListenAndServe always returns a non-nil error.
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr,

元記事を表示

goenvでGoインストール

♦︎goenvインストール
♦︎GOENV_ROOTの設定
♦︎GOPATH,GOROOTの設定
♦︎GOインストール

“`
goenv install
“`
本来のバージョンが表示されず下記になる
“`
:frowning2:
zsh: command not found: goenv
“`

“`
exec $SHELL を入力
“`
(又は$ source ~/.zshrc)
“`
$ goenv -v
“`
goenv 2.1.11など任意のバージョン)がでればOK

“`
goenv install
“`

-l/–list List all available versions

インストールできるバージョンは以下のコマンド
“`
$ goenv install -l
“`
最新バージョン探す
“`
goenv install 1.21.5
“`
インストール実行
“`
goenv versions
> 1.21.5
“`
“`
goenv global 1.21.5
“`
※プロジェクトごとに指定したい場合「g

元記事を表示

【VScode】Go言語で定義元にジャンプできないときの解決方法

### 解決方法①
setting.jsonに次のコードを追加。
“`
“go.useLanguageServer”: true,
“`

### 解決方法②
vscodeの拡張機能「Go」を入れた後に、

command + shift + Pで「Go Install/Updates」を選択し、全てのチェックボックスにチェックを入れてupdate!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562304/e8ba7171-8b5c-ab8a-4ea8-d93cf574efc5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562304/1276a07e-c3b9-9c01-655a-7fce79b80bf3.png)

定義元にジャンプできるようになりました。

### 解決方法③

goplsをダウンロードした際に、次のようなエラーが出た場合、Goのバージョン

元記事を表示

シェル(zsh・bash)切り替え・VIM

・GOENV_POOTの設定

“`
//使えるShell一覧が表示されます。
cat /etc/shells

//現在のシェルパス確認
echo $SHELL
“`
//bashに変更する場合
chsh -s /bin/bash

“`
zshに変更する場合
chsh -s /bin/zsh
“`
“`
//エラー
chsh: no changes made
“`
上記、エラーになり zshに変更出来ない場合
:clap:.ターミナル > 環境設定から一般

__________________________________

直接またはターミナルから編集隠れ

“`
vim .zshenv
“`
編集する時にまず「a(半角英数)」を押します。

するとファイルを編集できるようになるので編集したい内容を入力してください。

編集が終わったら「※Esc」を押してコマンドラインモードに切り替え

そして「:wq」強制保存「:wq!」を押せばファイルが保存されます。

編集している時ですが絶対にファイルを「x」ボタンを押すなどの強制終了はしないでください。

元記事を表示

golangの公式の構造化ロガー「slog」でシンプルなログを出す

go1.21から公式の構造ロガー「slog」が標準搭載されましたが、シンプルにログを出すことができなかったので、工夫したことをブログにします。

#### やりたいこと

1.ログレベルを指定できる

2.以下のように時間、レベル、メッセージがテキストで印字できる

“`
[2024-01-04 18:47:47.234] [ INFO] メッセージ
“`

#### slogだけだと何が駄目か?

パッケージにある関数を直接呼び出す `slog.Info(“info msg”)` という方法だと、レベル指定ができない

TextHandler だと、レベルを指定できが、印字される文字が以下のように`キー=バリュー`という以下のような文字列になり、読みにくい

“`
time=2024-01-04T18:20:16.149+09:00 level=INFO msg=メッセージ
“`

他の言語にあるFormatterなどを用いた指定もできない。

#### どうしたか

シンプルにログを出せる `SimpleHandler` を作った

以下、作ったコードです。そのまま動きま

元記事を表示

GCP Cloud Bigtable機能と実装

# GCPのCloud Bigtableの概要と機能

## 概要
Google Cloud Platform(GCP)のクラウドデータベースサービスであるCloud Bigtableは、大規模なデータセットをリアルタイムで処理するための高性能なデータベースです。Apache HBaseデータベースのモデルに基づいており、可搬性や拡張性、高可用性を提供します。

## 機能 / 詳細
以下にCloud Bigtableの主要な機能と詳細を示します:

### 1. スケーラビリティ
Cloud Bigtableは、十億を超えるレコードとペタバイト単位のデータを効率的に処理できるスケーラブルなデータベースです。データマスターとリージョンサーバーと呼ばれるノードによって構成され、自動的に拡張および縮小します。

### 2. ヘネシーに基づく分散設計
Cloud Bigtableは、Googleのヘネシーと呼ばれる分散ファイルシステムに基づいています。この設計により、高速なデータの読み込み・書き込みが可能で、データの分散処理も容易になります。

### 3. データモデリング
Cloud

元記事を表示

Go によるsessionの処理

## はじめに
Goでのsessionの扱いについてわかりやすく説明することを目標に記事を書きました。

## そもそもsessionとは?
・DBではなくサーバーに保存される情報で、容量はサーバーの容量に依存する。
・key,valueを設定して好きな値を保存できる。
・sessionに保存されるid でクライアントのcookieと結びつく。
・ログイン後はログアウトするまで基本的に消さないデータ。有効期限を設定しているなら、それを超えたら消える。

## Goでのsessionの扱い
sessionを保存するのに便利なパッケージのgorilla sessionを使用してsessionの扱いを紹介します。
https://github.com/gorilla/sessions

まずsessionを保存するためのstoreを作成します。
“`
var cs *sessions.CookieStore = sessions.NewCookieStore([]byte(“secret-key-xxxxx”))
“`
ここの引数の[]byte(“secret-key-xxxxx”) は

元記事を表示

【2024】Go言語おすすめライブラリ15選

# Go言語ライブラリ15選

Golangのおすすめのライブラリを**15個**(+おまけ1個)紹介します。ライブラリの特徴、インストール方法、使い方を徹底解説していきます。

## [cmp](https://pkg.go.dev/github.com/google/go-cmp/cmp)

テストで等価性を調べるために使うライブラリ。`reflect.DeepEqual`ははオブジェクトが完全一致していないと *false* になるが、**cmp** を使うとスライスの順番を無視できたり、一部のフィールドを比較対象から除外したり、様々なオプションを追加することができる。また、`diff`で差分を出すこともできる。

“`go:main.go
package main

import (
“fmt”
“reflect”

“github.com/google/go-cmp/cmp”
“github.com/google/go-cmp/cmp/cmpopts”
)

func main() {
slice1 := []int{1, 2, 3}
slice2 := []

元記事を表示

Go の開発環境構築(Mac)

## 手順
Go の開発環境構築を Mac で行う場合は、Homebrew を使い、下記のコマンドでインストールできます。
“`
$ brew install go
“`

下記のコマンドでバージョンが表示されれば、インストール完了です。
“`
$ go version
go version go1.21.5 darwin/amd64
“`

## 注意点
brew install コマンドを実行してもターミナルに何も表示されない、もしくは下記が表示される場合は、Homebrew の更新に時間がかかっているため、しばらく待つ必要があります。
“`
Updating Homebrew…
“`

また、下記のエラーが出る場合は、Frameworks フォルダに書き込み権限が無いため、ターミナルに表示された `sudo chown -R [user name] /usr/local/Frameworks` コマンドで、フォルダのオーナーを変更する必要があります。
“`
Error: The following directories are not writable by

元記事を表示

【個人開発】草生えてないと怒ってくれるBOTを作った

明けましておめでとうございます。

新年早々少し個人で開発したのでそのアウトプットとして投稿させていただきます。

全てのツールを無料枠で抑えて作ることができるので、個人で開発してデプロイまでしてみたいと思っている人に参考になれば良いなと思います。

## 作ったもの

草(commit)がされていない場合にはその日の夕方に通知を送ってくれるLineのBOTを作りました。

**Githubリンク**

https://github.com/yuta-2001/go-no-commit-notify

## 作成動機

– 新たな年が始まって、より成長できる年にしたく継続を促せるようなものを作りたかった。
– これまで触れていないものを使って何か作ろう、自分の技術の幅を広げようと思ったから。(Goも含めて全て開発で使ったことはなかったです。)

## 使用技術・構成

– AWS Event Bridge (cron)
– AWS Lambda
– Line Notify
– Github GraphQL
– Golang

(コンテナ化(Docker)は図に乗っていますが、現在進行

元記事を表示

WidowsやLinuxでGoCVを使用したGOプログラムをstatic buildしたい話

# 背景

自分の開発PC(Windows)上でGoCVを使ったプログラムを書いて「よっしゃ!ビルドして`.exe`を作って、他のWindowsユーザにも配布や!」と思ったとき、うまくいかなくてハマりました。

# 現象

開発PCには下記の記事の作業手順に従って環境構築を行いました。

https://qiita.com/Nekonun

ビルド対象のGoのプログラム(プログラム中でGoCVを使用している)があるフォルダで下記コマンドでビルドすると、同じフォルダ内に`.exe`ファイルが出力されます。

“`
> go build .
“`

ここで生成された`.exe`ファイルをそのまま他のWindows環境 (GoCVの環境未構築) に配布してその上で実行しても、途中でエラーが発生してアプリケーションが落ちます。具体的には **GoCVを使用した処理が走った時点で落ちます**。

## 理由

どうやら下記の二つが原因だったようです.

– OpenCVのビルド時に静的ライブラリ(.a)ではなく動的ライブラリ(.so)を生成してしまっていたこと
– goプログラムのビルド

元記事を表示

OTHERカテゴリの最新記事