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

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

intel上でLXDCLIを用いてGO+Pythonの環境を爆速で構築する

## 目的
Goの環境を構築しろと言われることは多いと思う。今回はintel上でlxdcliを用いてgoの環境を構築しようと思う。

## 構築
lxdfile
“`bash
CONTAINERNAME ubuntu-go
FROM ubuntu/23.04

RUN export DEBIAN_FRONTEND=noninteractive
RUN timedatectl set-timezone Asia/Tokyo && hostnamectl set-hostname ubuntu-go
RUN apt-get -y update

RUN dpkg –configure -a
RUN echo “\n\n\n” | apt-get -y install openssh-server
RUN apt-get -y install docker docker.io docker-compose nano curl

RUN echo -e “root:password” | chpasswd
RUN echo -e ‘PermitRootLogin yes’ >> /et

元記事を表示

Next.js × Go のWebアプリをDocker上で作成してみませんか? 〜バックエンド実装編〜

# はじめに
?こんにちは!Web系の企業に勤務し、地方からフルリモート勤務をしている@takakouと申します?️✨

今回は、「**Next.js × Go のWebアプリをDocker上で作成してみませんか? 〜バックエンド実装編〜**」というテーマで記事をシェアします!??

この記事を執筆しようと思った経緯としては、私自身が **Next.js** × **Go** × **Docker**の組み合わせでアプリを作成しようとした際、この技術スタックに関する情報が少なく、詰まることも多かったからです??

そこで、同じように、この組み合わせの技術スタックに興味を持つ初学者の方々のために、Dockerを使用して環境を構築する方法を詳しくシェアしたいと思い、この連載を始めました。?

記事執筆は未熟者で、至らない点もあるかと思いますが、皆さんのコメントやフィードバックをお待ちしています!??
# 目次

1. [前提条件 ?](#1-前提条件)
1. [対象者 ?](#2-対象者)
1. [動作環境 ?️](#3-動作環境)
1. [技

元記事を表示

Go言語で作ったPubSub起動のCloud Functionsの関数をローカル環境(Mac)で動かす

# 概要

PubSubのイベントを受け取って起動するGo言語で作った Cloud Functions の関数をローカル環境で実行する方法

## 参考

– [Functions Framework  |  Google Cloud Functions に関するドキュメント](https://cloud.google.com/functions/docs/functions-framework?hl=ja)
– [Function Frameworks を使用した関数を実行する  |  Google Cloud Functions に関するドキュメント](https://cloud.google.com/functions/docs/running/function-frameworks?hl=ja)
– [ローカル関数を呼び出す  |  Google Cloud Functions に関するドキュメント](https://cloud.google.com/functions/docs/running/calling?hl=ja)

# 事前準備

– goのversionを1.18

元記事を表示

Sprintf関数は本当に遅いのか、検証してみた

## 経緯
Goのプログラムで、文字列を結合する処理を行うために以下のようなコードを書いてプルリクを出したところ、

“`go
id := “1000”
url := fmt.Sprintf(“https://example/path?id=%s”, id)
“`
以下のような指摘をもらった。
>Sprintfは遅いので、文字列結合を使ってください

当時は、素直に“`url = “https://example/path?id=” + id“`のように書いて終わったのだが、本当に遅いのか、実証できていなかったので確認する事にする。

## 検証環境
macOS Ventura 13.2.1

“`shell
$ go version
go version go1.21.2 darwin/amd64
“`

## 検証
Sprintfと、単純に文字列を結合する処理にかかる時間を比較するため、以下のメソッドを用意する。
“`go
func formatStringUsingUnion() {
_ = “Hello” + “,” + “world”
}

f

元記事を表示

gqlgenでカスタムモデルを使った際に panic: interface conversion でハマった話

# 概要
DataLoaderを使うためにgqlgenにカスタムモデルを導入した際、
`gqlgen`で`panic: interface conversion`エラーが発生したので、その解決の記録を残します。

DataLoaderってなんやねん って方は以下がわかりやすいです。
簡単にいうと、N+1問題を避けるためにバッチ処理を使って効率的にデータを取得しようってことみたいです。

https://dev.classmethod.jp/articles/graphql-dataloader-sample/

# おことわり
– 筆者はBE1年目の駆け出しGopherです。
– 表現に曖昧な箇所や不正確な箇所があるかもしれませんがご容赦ください。

# ハマった内容
### グラフモデルの生成
schemaを以下のように記述し、gqlgenしました。

“`graphql:schema.graphqls
type User {
id: ID!
name: String!
department: Department!
}

type Department {
# 省

元記事を表示

Remote Developmentを使って爆速でGo&PostgreSQLの環境構築を行う

こんにちは!
Remote Developmentを使ったGoの開発に関してまとめましたので参考になれば幸いです

## github リポジトリ
以下をcloneすることでこの記事に書かれてることが再現できます!

https://github.com/mikaijun/go-postgre-onboarding/

## こんな方にオススメ!

– これからGoを学習したい方
– Goを使ってデータベースとのやりとりを行いたい方
– ローカルマシンを汚したくない方(brewなど)
– Dockerは使いたいけど詳しい設定はよくわからない方
– Githubを使ってGoのコードをリモートにpushしたい方

### この記事で扱わないこと

– VSCodeのインストール方法
– Docker(Docker Desktop)のインストール方法
– Githubのアカウント登録
– SQLの解説や使用したGoのパッケージの解説
– SSHを使用したGitHubへの接続
– 最速で開発できることをを目的としてますのでビジネスで開発する場合はSSHの使用を検討してください

## Re

元記事を表示

【Golang】base64でエンコードされたデータをデコードして、AWS S3にアップロードする

## 概要
Goを使って、Base64でエンコードされた文字列をJSONで受け取り、S3にアップロードしてみます。APIアクセス周りはEchoを使いました。
ファイルをS3にアップロードする際に、クライアントサイド/サーバーサイドのどちらから行うのか、またデータをどのようにやりとりするのか、などの観点で色々方法はあると思いますが、今回はBase64文字列をJSONで受け取り、デコードしてS3にアップロードする方法を試してみました。

参考:[ファイルをS3にアップロードするときはサーバー?クライアント?](https://kenny27.hatenablog.com/entry/2019/06/07/233541)

### バージョン
– Echo:4.5.0
– Go:1.17.1

## ファイル構成
“`
main.go
aws/
├ config.go
└ s3.go
“`

## aws-sdk-goのインストール

“`go
go get -u github.com/aws/aws-sdk-go
“`

## config.go
以下のように、awsのアク

元記事を表示

Mac(m1)でProtoc (Protocol buffer)をインストールしたけど見つからなくて困った話

gRPCを試してみたくて、protocl buffer (protoc)をインストールの仕方を調べてみたけどスムーズにいかなかったのでメモ

### 環境
M1 mac (pro)

### やったこと

まずはprotocol bufferをインストール
“`
brew install protobuf
“`

インストール成功(してるっぽい)
> ? /opt/homebrew/Cellar/protobuf/24.3: 395 files, 13.2MB
==> Running `brew cleanup protobuf`…
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Caveats
==> protobuf
Emacs Lisp files have been installed to:
/opt/homebrew/share/emacs/site-l

元記事を表示

【初心者向け】はじめてのWebアプリケーション開発 デモアプリ作成 フロントエンド編

## はじめに
 言語学習を終えた後、本格的なWebアプリを開発する前に、フロント、バックエンド、Dockerなど使用予定の技術をを組み合わせた簡単なデモアプリを作成しました。
 作成した理由は、いきなりすべての技術を組み合わせたアプリを開発すると、設定がごちゃごちゃになると考えたからです。
この記事では言語 + フレームワーク + UIフレームワークの環境構築について記載します。
 WindowsPCでUbuntuでLinux環境を構築して開発を行いました。Ubuntu等の環境設定方法は以下の記事に記載しました。
[windowsでUbuntu,homeblew,nodebrewをインストール、VSCodeでTypeScript環境を構築する](https://qiita.com/bear05/items/265401176698bccbfee4)

## バージョン等
Windows10
Ubuntu 20.04.4 LTS
Homebrew 3.5.7
nodebrew v18.7.0
node v18.7.0
npm 8.15.0

エディタ…VSCode
typescrip

元記事を表示

Goのiotaは定数宣言のインデックス

Goの公式docに沿って「iotaとは何か」を読み取っていきます

## iotaの概要

>Within a constant declaration, the predeclared identifier iota represents successive untyped integer constants. Its value is the index of the respective ConstSpec in that constant declaration, starting at zero.
(定数宣言内で、事前に宣言された識別子iotaは、型付けされていない連続した整数定数を表す。その値は、定数宣言内の各 ConstSpec のインデックスで、0 から始まります。)

– つまりiotaは定数の宣言行に対応したインデックス
– 補足
– 「型付けされていない整数定数」
– →Intではあるものの、どのIntか(Int8、Int16など)は決まっていないということ
– 「ConstSpec」
– →定数の宣言行のこと

元記事を表示

[Go]変数についてまとめた。[初心者向け]

## 初めに

Goの環境構築は、以下の記事を参考にして見てください。

https://qiita.com/yuto_swift_flutter/items/0a3d978c3cf557719d0a

## 変数について

明示的な変数の定義は以下です。

“`Go
func main() {
var i int = 100
fmt.Println(i)
}
“`

こちらを、**go run main.go**をプロジェクトのルートで叩くと、

“`Go
100
“`

このように100が出力される。

int型以外も同様に出力できます。

“`Go
func main() {
var i int = 100
fmt.Println(i)

var s string = “Hello”
fmt.Println(s)

var t,f bool = true,false

fmt.println(t.f)
}
“`

ちなみにGoは宣言した変数や定数をどこかしらで使わないとビルドエラーが起きる。
これありがたい機能ですよね。

#### 異なる型を同時に

元記事を表示

csv を1行ずつ struct に読み込むやつ

# モチベーション

csv を1行ずつ読んで struct にパースして yield みたいなのがやりたかった。
csvutil の中では1行ずつ読み出してるので巨大な csv でもいけるはず。

サンプルデータは titanic で。
https://github.com/datasciencedojo/datasets/blob/master/titanic.csv

# コード

“`go
package main

import (
“encoding/csv”
“flag”
“fmt”
“io”
“os”

“github.com/jszwec/csvutil”
)

type Titanic struct {
C1 int32 `csv:”PassengerId”`
C2 int32 `csv:”Survived”`
C3 int32 `csv:”Pclass”`
C4 string `csv:”Name”`
C5 string `csv:”Sex”`
C6 string `csv:”Age”`
C7 stri

元記事を表示

Generics 関数の中で制約付きのポインタ型と実体型を両方扱いたい

Go1.20 の頃の話なんですけど。

# お困りごと

こんな感じでレシーバがポインタで宣言されてて、かつ関数の中でレシーバのフィールドを触ってるケース。

“`go
type Hogeable interface {
Hoge()
}

type HogeUser1 struct{ s string }
type HogeUser2 struct{ s string }
type HogeUser3 struct{ s string }

func (h *HogeUser1) Hoge() {
h.s = “HogeUser1”
fmt.Println(h.s)
}
func (h *HogeUser2) Hoge() {
h.s = “HogeUser2”
fmt.Println(h.s)
}
func (h *HogeUser3) Hoge() {
h.s = “HogeUser3”
fmt.Println(h.s)
}
“`

これを実体宣言して呼び出す Generics 関数を用意したい、となったとき。
ナイーブに Generics にすると、`T` が

元記事を表示

[Azure] OpenAPI Serviceの機能/実装

# AzureのOpenAI Serviceについて

AzureのOpenAI Serviceは、Microsoft Azureクラウドプラットフォームの一部として提供されるAI(人工知能)モデルとサービスの統合である。OpenAI Serviceを使用することで、開発者は自然言語処理(NLP)や会話AIなど、さまざまなタスクを処理するための強力なツールとリソースにアクセスできます。以下では、OpenAI Serviceの概要と主な機能について詳細に説明する。

## 概要

AzureのOpenAI Serviceは、AIモデルやNLP機能を提供するためのクラウドベースのサービス。このサービスは、開発者が高度な自然言語処理タスクを簡単に実現できるように設計されており、スケーラビリティと柔軟性を備えている。また、OpenAI Serviceは、学習済みモデルを使用して、テキスト生成、文章分類、翻訳、質問応答、文章要約などのタスクを実行することができる。

## 機能

OpenAI Serviceには、以下の主な機能がある。

1. テキスト生成(Text Generation):

元記事を表示

GoでWebアプリケーション#2

### やったこと

HTMLテンプレートファイルを読み込ませてブラウザ上で表示

### ソース

“`
package main

import (
“html/template”
“log”
“net/http”
“path/filepath”
“sync”
)

type templateHandler struct {
once sync.Once
filename string
templ *template.Template
}

// HTTPリクエストの処理
func (t *templateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
t.once.Do(func() {
t.templ =
template.Must(template.ParseFiles(filepath.Join(“templates”,
t.filename)))
})
t.templ.Execute(w, nil)
}

func main() {
http.

元記事を表示

【Go】select 文とは? – ゴルーチンの制御

# `select`文 – ゴルーチンの制御

Go言語は並行処理を強力にサポートしており、そのための主要なツールとしてゴルーチン(軽量スレッド)とチャネル(ゴルーチン間での通信メカニズム)があります。`select`文は、複数のチャネル操作(送信や受信)の中から、実行可能なものを選択するための制御構造です。

## 基本的な使い方

`select`文は、以下のような形式で使用します:

“`go
select {
case msg1 := <-ch1: fmt.Println("Received", msg1) case ch2 <- 2: fmt.Println("Sent 2 to ch2") case msg3, ok := <-ch3: if ok { fmt.Println("Received", msg3) } else { fmt.Println("ch3 is closed") } default: fmt.Println("No communication") } ``` 上記の例

元記事を表示

【Go】make 関数とは?

# `make`関数について

Go言語には、特定の型を初期化するための関数、`make`があります。この関数を理解することで、Goのデータ構造をより効果的に使用することができます。

### `make`って何?

`make`関数は、Goのいくつかの特定の型(スライス、マップ、チャネル)を初期化して、使用可能な状態での値を返すための関数です。

# 作成できる型

### 1. スライスの初期化

スライスは、配列の部分的なビューを提供するデータ構造です。`make`を使用することで、指定したサイズと容量のスライスを生成できます。

“`go
s := make([]int, 5) // 長さ5、容量5のintスライス
“`

### 2. マップの初期化

マップは、キーと値のペアを保存するためのデータ構造です。`make`を使用して、新しい空のマップを作成できます。

“`go
m := make(map[string]int) // stringをキーとし、intを値とするマップ
“`

### 3. チャネルの初期化

チャネルは、ゴルーチン間での通信や同期をサ

元記事を表示

What’s New from CircleCI – 2023/10/03

CircleCIは日々進化していますが、その変化に追いつくのは大変ですよね。
What’s New from CircleCI を毎週チェックして、CircleCIの最前線をキャッチアップしてくださいね!

[< What’s New from CircleCI – 2023/09/26](https://qiita.com/CircleCIJapan/items/26c88c03513af66e25e9) | 今週

# ブログやスライド、ビデオ
## ユーザーからの声
– [pt-online-schema-change の実行が必要かどうか判断するタイミングをより早くした話](https://tech.repro.io/entry/2023/10/03/090000) by Repro
– MySQLのスキーマ変更を行う際に、pt-online-schema-change の実行が必要かどうかを判断するタイミングをより早くするために、テスト環境でのスキーマ変更を自動化した話です。
– [ココナラiOSアプリの最近の取り組みと今後の取り組み](https://zenn.de

元記事を表示

【Go】標準パッケージの trace とは?

# `trace`パッケージ とは?
Go の標準パッケージの trace は、アプリケーションの実行中に発生したスタックトレースの情報を記録するためのパッケージです。このパッケージを利用することで、アプリケーションの実行中に発生したエラーの原因を特定したり、アプリケーションのパフォーマンスを分析したりすることができます。

trace パッケージの基本的な使い方は、次のとおりです。

“`go
package main

import (
“runtime/trace”
)

func main() {
// トレース開始
trace.Start()

// エラーを発生させる
_, err := doSomething()
if err != nil {
// エラーを処理する
fmt.Println(err)
}

// トレース終了
trace.Stop()
}

func doSomething() (int, error) {
// 何かしらの処理を行う

元記事を表示

Go 1.22でのForループの変数スコープの変更について

## はじめに
最近、Goのブログで「[Fixing For Loops in Go 1.22](https://go.dev/blog/loopvar-preview)」という記事が公開されました。この記事では、Go 1.22でのforループの変数スコープに関する変更について詳しく説明されています。
以下、その内容を紹介します。

## 記事の内容
Goのコード書いていて、forループの変数スコープに関する問題に直面したことはありますか?
Go 1.22では、この問題に対する重要な変更が導入されます。

## 問題点
Goでの一般的なミスの一つは、**ループ変数への参照をその反復の終了後も保持してしまうこと**です。
これにより、予期しない動作が生じることがあります。

例えば、以下のコードを考えてみましょう。

“`go
package main

import “fmt”

func main() {
done := make(chan bool)
values := []string{“a”, “b”, “c”}
for _, v := range values {

元記事を表示

OTHERカテゴリの最新記事