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

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

Go学習2周目でのつまづいたところの気付き

## Goを1から学んでみた
この度Go言語を独学で学んで実務で使うことになりました。
チュートリアル、本、Udemyの講座で一通りGoの文法を学んでみて、1ヶ月経った後に実務で使うことになったのですが、1周目では気づかなかったけど2周目で腑に落ちて学べたことをメモします。
Go言語をやっている人には当たり前のことですが、他言語からスキルチェンジした人にとっては共感できることもあるかもしれません。

### packageはディレクトリごとに管理する
Goではファイルの先頭にpackageをまず宣言するが、それは同じディレクトリにあるものは同じpackageを使うのが慣例。

### 同じpackageにある定数や関数はそのまま使える
同じlessonというpackageに属している2つのファイル間で定数numberを共有できる。

“`go:lesson.go
package lesson

const number int = 3
“`

“`go:lesson_test.go
package lesson

const number2 int = number
“`

元記事を表示

Go + GoLand + DevContainer + Air + delveのイケイケ環境構築でデバッグを行う。

# 概要
本記事ではGo言語を手っ取り早く動かせる環境を構築したい方向けの記事です。
良ければ、参考にしてください。
## TL;DR
ディレクトリ構成がクリーンアーキテクチャを意識しているので、若干違いますが、動作します。
ファイル作成が面倒な方はこちらをどうぞ。
cloneしたらスターもらえると嬉しいです。
https://github.com/sirayusan/business/tree/develop

## 環境
Windows11 Pro
Docker 4.12.0
WSL2 WSL バージョン: 2.0.9.0
Ubuntu 22.04.3 LTS
GoLand 2023.3.2
# 使用技術と開発支援ツール
Docker
DevContainer
GoLand(IDE)
Air(ホットリロード)
delve(デバッガ)
## 言語
Go 1.20
## DB
MySQL 8.0
## ディレクトリ構成
“`
business
├── .devcontainer
│ ├── infra
│ │ ├── go
│ │ │ └── Dockerfi

元記事を表示

GoにおけるAPI並列処理について

### はじめに
APIデータ取得を高速化する方法として、並列処理が有効です。Goの `sync.WaitGroup` を活用し、異なる2つのAPIからデータを並列で効率的に取得する方法を紹介します。具体的な例として、ユーザーデータと製品データの取得を行う架空のシナリオを設定し、直列処理と並列処理のコードを比較します。

### 改善前コード(直列処理)
“`go
package main

import (
“errors”
“fmt”
)

// UserData はユーザーのデータを表す架空の構造体です。
type UserData struct {
ID string
Name string
}

// ProductData は製品のデータを表す架空の構造体です。
type ProductData struct {
ID string
Title string
}

// FetchUserData は架空のユーザーデータ取得APIを模倣します。
func FetchUserData(userID string) (

元記事を表示

Float型の標準出力の有効数字のデフォルトはなぜ6桁なのか


Float型の標準出力の有効数字のデフォルトはなぜ6桁なのか

**風船ガム**

イチゴ味の風船ガムを食べてました。

くちゃくちゃ味わい、ふくらます。
口に広がる甘酢っぱさ。
フルーティーが鼻をつつく。

何回かそれを繰り返していると ふと
どれくらい大きくなるのだろうと
思いました。

おもいっきり息を吐き 
風船ガムをふくらませました。

ドンドン大きくなるガム。

破けることなく大きくなり
ついに私は空を飛びました。

ああ、でも残念なことに
私はずっと上を向いたまま。

下に広がる素敵な景色は見れません。

「私はどこまで浮かびつづけるのでしょうか」

浮かびながら空に聞くのでした。

**目次**
[1. そもそもFloat型って何?](#1-そもそもfloat型って何)
[2. Float型の標準出力の例](#2-float型の標準出力の例)
[3. なぜデフォルトは6桁なのか](#3-なぜデフォルトは6桁なのか)
[4. おわりに](#4-おわり

元記事を表示

Go導入はやっぱり悪戦苦闘するという話

# はじめに
Hubbleでバックエンドエンジニアをしている @power3812 です。オブジェクト指向大好きマンで、神クラスを作れないかと模索の日々です:innocent:

今回は普段Rubyをメイン言語としている弊社がGo導入に悪戦苦闘した話をしようと思います!

## 経緯
弊社ではメインでRuby、サブシステムにJava、Pythonを使用していました。
しかし、社内からエンジニア的な欲求としてGoを使用してみたいという声が多かったのと、エンジニア採用面から使用できる機会を窺っていました。

そんな中、そこまでfatではない[新アプリケーション](https://hubble-docs.com/news/forms)のAPIに使用してみようということになりました。

## 技術選定
今回の新APIは、ほぼ自分1人で担当することになったので予めエコシステム周りを決定していくことにして、以下の構成で行くことにしました。

– フレームワーク – Echo
調べた感じEchoとGinの2大巨頭っぽい
Ginだとワイルドカードパスを使用した共有のルーティングでコンフリクトが発生する

元記事を表示

go-awslambda

“`text
— FAIL: TestSlogtest (0.03s)
\zapslog\logger.go:130: message
\zapslog\logger.go:130: INFO message {“k”: “v”}
\zapslog\logger.go:130: msg {“a”: “b”, “c”: “d”}
\zapslog\logger.go:130: INFO msg {“k”: “v”}
\zapslog\logger.go:130: msg {“a”: “b”, “k”: “v”}
\zapslog\logger.go:130: msg {“a”: “b”, “G”: {“c”: “d”}, “e”: “f”}
\zapslog\logger.go:130: msg {“a”: “b”, “e”: “f”}
\zapslog\logger.go:130: msg {“a”: “b”, “c”: “d”, “e”: “f”}
\zapslog\logger.go:130

元記事を表示

Goの最初に行うinitでの初歩的なミス備忘録

## 発現法

Goのプロジェクトを立ち上げて、`main.go`を作成します。`package main` を記述して`go mod init`コマンドを打ち込んで初期化を行おうとしました。下記のエラー発現。

## エラー内容

“`tsx
go: cannot determine module path for source directory /Users/hogehoge(outside GOPATH, module path must be specified)

Example usage:
‘go mod init example.com/m’ to initialize a v0 or v1 module
‘go mod init example.com/m/v2’ to initialize a v2 module

Run ‘go help mod init’ for more information.
“`

## 解決策

`go mod init あなたのプロジェクト名(モジュール名?)` と最後にモジュール名を指定する必

元記事を表示

ChatGPTを相手に英会話レッスンができるアプリを作成

# 英会話レッスンを(ほぼ)無料でいつでもやりたい!
英会話レッスンを受けたいとき、お金がかかり時間も拘束される。
そこで、ほとんど無料でいつでもpcブラウザやスマホで英会話レッスンができるアプリが欲しいと思い開発することにした。
ほとんど無料である理由は、ChatGPTを呼び出すためにOpenAIのAPIにクエリを投げる際にごく少額の料金がかかるからである。(だいたい1会話0.1円未満)

# アプリの構成
アプリはpcブラウザ、スマホからアクセスできアクセス元の環境に関係なく、前回までの会話を続けられるようにする。
会話の入力はpcブラウザ、スマホの音声入力APIを使って行い、入力に対するChatGPTの応答は音声読み上げAPIを使って読み上げることにより、会話ができる。
また、会話はルーム単位で管理する。
なお、今回は英会話レッスンをすることが目的であるため英会話のみに対応すれば十分であるが、音声入力APIと音声読み上げAPIは多くの言語に対応しているため、中国語、フランス語、スペイン語などAPIが対応している言語のレッスンも本アプリでは行うことができる。(ルーム単位で設定言語を

元記事を表示

ラズベリーパイにgoofysをインストールする

– [kahing/goofys | GitHub](https://github.com/kahing/goofys)

# GOのインストール

ラズパイのOSが32bitか64bitかダウンロードファイルが異なります。
32bitなら `armv6l` 、 64bitなら `arm64` を選択します

“`bash
# パッケージのダウンロード
# GOLANG_DL_URL=”https://go.dev/dl/go1.21.1.linux-arm64.tar.gz” # 64bit
GOLANG_DL_URL=”https://go.dev/dl/go1.21.1.linux-armv6l.tar.gz” # 32bit
wget -O /tmp/go.tar.gz $GOLANG_DL_URL
rm -rf /usr/local/go && tar -C /usr/local -xzf /tmp/go.tar.gz

# パスを通す
echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.bashrc
source ~/.

元記事を表示

  【Golang】go mod を理解せず自作の package を動かす

  【Golang】go mod を理解せず自作の package を動かす

# 概要
バージョンいくつかは知らんが、あるバージョンから go mod やらで既存の記述での自作 package が使えなくなってしまった。
go mod を理解して使おうという気は無いので、動けば OK 程度に既存の環境からの変更を記録する。

# 環境
PC:M1 Macbook Sonoma
Go
“`
> go version
go version go1.21.6 darwin/arm64
“`

# 既存環境(昔の記述:今これじゃ動かないよ(?))
## ディレクトリ構造
“`
> tree
.
├── main.go
└── testlib
└── testfunc.go

2 directories, 2 files
“`
## ファイル記述
“`main.go
package main

import “./testlib”

func main() {
println(“hello from main func”)
testlib

元記事を表示

GCP Cloud Dataprep機能/実装

# GCPのCloud Dataprepの概要と機能

## 目次
– [概要](#概要)
– [Cloud Dataprepとは](#Cloud-Dataprepとは)
– [主な特徴](#主な特徴)
– [機能/詳細](#機能/詳細)
– [データ準備と変換](#データ準備と変換)
– [視覚的なデータ探索とプロファイリング](#視覚的なデータ探索とプロファイリング)
– [データ品質の監視と洞察](#データ品質の監視と洞察)
– [簡単なデータのシェアとコラボレーション](#簡単なデータのシェアとコラボレーション)
– [まとめ](#まとめ)
– [サンプルコード](#サンプルコード)

## 概要

### Cloud Dataprepとは
Cloud Dataprepは、Google Cloud Platform(GCP)のデータプレパレーション(データ準備)サービスです。データのクリーニング、変換、統合などを視覚的に行うことができます。クラウド上で簡単にデータの事前処理や前処理を行い、データ分析や機械学習モデルのトレーニングに使用することができます。

元記事を表示

A Tour Of Go Exercise

# A Tour Of GoのExercie集

https://go-tour-jp.appspot.com/list

# Exercise: Loops and Functions

https://go-tour-jp.appspot.com/flowcontrol/8

“`go
package main

import (
“fmt”
)

func Sqrt(x float64) float64 {
z := 1.0
for i := 0; i < 10; i++ { z -= (z*z - x)/(2*z) fmt.Println(z) } return z } func main() { fmt.Println(Sqrt(4)) } ``` # Exercise: Slices https://go-tour-jp.appspot.com/moretypes/18 ```go package main import "golang.org/x/tour/pic" func Pic(dx, dy int) [][]uint8 { ma

元記事を表示

go言語 外部コマンドの備忘録

## Go言語の外部コマンドでハマった件の備忘録

### やりたかったこと
goの外部コマンドからconda activate 環境名で仮想環境のアクティベートしてpythonファイルを動かしたい

“`
import (
“log”
“os/exec”
“fmt”
)

func main(){
out, err := exec.Commond(conda activate 環境名).Output()
if err = nil{
log.Fatalln(err)
}
fmt.Println(string(out))
}
“`
これでいけるかと思ったがエラー( status exit 1 )しか返ってこない

外部コマンドでconda仮想環境をアクティベートするときは
exec.Command()の引数を(“bash”, “-c”, “source activate 環境名”)とするらしい

ということで

“`
import (
“log”

元記事を表示

Golang + Reactで並び替えができる配列のDBテーブル・フォームを作ってみた

## はじめに
前回はポートフォリオを大改造してデータをデータベースで管理するようにしました。

https://qiita.com/piny940/items/f1a15f7a797c4d0f7461

今回は、前回やり残した「プロジェクトの並び替え」部分を実装した話を記そうと思います。

## 抱えていた問題

前回ポートフォリオのデータをデータベースで管理する方向性にシフトしたのですが、DB設計の段階で考え漏れていたことがありました。それは「プロジェクトの並び替え」です。
プロジェクトは現状、写真のようにスターがついたものが上に来るようになっているのですが、Starがついたプロジェクト同士 / Startがついていないプロジェクト同士の順序については操作ができない設計になっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330232/6c0689e6-10b5-b54f-df1b-845fa0f4827e.png)

そこで今回は、順序を保存するカラムを追加

元記事を表示

Goのポインタ使い所,使わなくていい所

# ポインタってどういう時に使うべき?
Goにおけるポインタの使い所は難しいと思います. というのも,Goはスライスやマップなど値かポインタかが初見では分かりづらいようなデータ構造があります.直感的に分かりづらく,ポインタでなければうまく動かない処理があったりします.Goのポインタ周りは感覚でコードを書くと,意外なエラーや,予想外の挙動に直面します.

具体的には,以下のような状況において,私はポインタを使うかどうかよく迷います.
– 関数の引数(配列,スライス,マップ)は,ポインタと値どちらが適切か?
– 構造体をマップに格納する時,よくポインタが格納されているが値ではダメなのか?
– メソッドのレシーバ引数は値とポインタどちらが良いのか?
– Rangeループは配列やスライスの要素を書き換えられるか?

今回の記事では,Goのポインタについて,宣言や値のポインタ化などの基礎構文から,ポインタの使い所を具体例を交えつつ,解説していきたいと思います.

# ポインタの基礎構文
## 宣言
cなどは変数名の前に\*をつけますが,Goでは型の前に\*をつけてポインタを定義します.

“`

元記事を表示

テスト投稿

これはテスト投稿です。

元記事を表示

GoでSSG(静的サイトジェネレーター)を手作りしてみた

## 目的

この記事([Writing a Static Blog Generator in Go](https://www.zupzup.org/static-blog-generator-go/index.html))を読んでから自分でもやってみたいなと思っていたのでゴリっと作ってみました。

既存のSSGの置き換え等々は全く考えておらず、あくまでも興味駆動の開発になります。

## 作ったもの

https://github.com/K-Sato1995/go-simple-ssg

↑を使用して作った静的サイト

https://go-simple-ssg.vercel.app/

## 構成

やった事としては大枠

– マークダウン(記事のコンテンツ)+テンプレート(HTML)を元に静的なファイルを生成する部分
– CLIで↑を利用して誰でもプロジェクトの骨組みができるようにする部分

だけなので大したことはしていないのですが全体感としては下記のようになりました。

“`
./
├── parser/ (MarkdownをパースしてHTMLに変換する部分)
│ ├

元記事を表示

golang[Go言語]でインポート分のパスを指定する方法。

# 記事作成背景
import分変えたいなって思った時どこを変えたらよいか自分用のメモです。

# 修正内容
go.modのmoduleを変える。
“`go:go.mod
module business←ここ

go 1.15

require (
github.com/go-sql-driver/mysql v1.5.0
github.com/joho/godotenv v1.3.0
)

puts ‘The best way to log and share programmers knowledge.’
“`

元記事を表示

Goのスライスを効率的にソートする方法

## はじめに
Go言語はそのシンプルさと効率の良さで人気を集めていると思っている。特に、スライス(動的配列)の操作はGoの重要な特徴の一つです。今回は、Go言語でスライスをソートする具体的な方法を、実用的な例を交えてご紹介しようと思います。

## サンプルコードと説明
“`go
package main

import (
“fmt”
“sort”
“time”
)

type Article struct {
Title string // 記事のタイトル
CreatedAt time.Time // 記事が作成された日時
}

// Articles は複数のArticleを含むスライスです。
type Articles []Article

// SortByCreatedAt はArticlesをCreatedAtフィールドに基づいて昇順にソートします。
func (a Articles) SortByCreatedAt() {
sort.SliceStable(a, func(i, j int) bool {
return a[i].Cre

元記事を表示

【GO】Gormを使って子テーブルのデータを取得したい

# はじめに
GORMを使って、親と子テーブルのデータを両方取得するのに苦労したので、備忘録として残しておきます。
GORMは[公式ドキュメント](https://gorm.io/ja_JP/docs/index.html)が丁寧に書かれているので、そちらも合わせてご覧いただくと良いかと思います。

# 結論
`preload`を使って、子テーブルのデータを取得しました。
`preload`とは、Eager Loading(イーガーローディング)の一種で、メインのクエリと一緒に関連するデータを予め読み込む機能です。これにより、N+1問題を避けて子テーブルのデータを取得できます。
`JOIN`と`SELECT`を使うことでも子テーブルのデータを取得できたのですが、今回はより簡単に使える`preload`を採用しました。
以下の構造体を例に`Preload`の使い方を簡単に説明します。
“`go
// UserがOrderをhas manyで持つ
type User struct {
Name string
Email string
Orders []Order
}

//

元記事を表示

OTHERカテゴリの最新記事