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

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

バージョン切り替えのコマンド絶対いつも忘れるので一覧化しとく

https://github.com/anyenv/anyenv
最近存在を知ったanyenvであれこれxxenv化したいなぁと思いつつも、すでに汚れてしまった私の環境を整理していくのは腰が重いので、最近よく使う言語のバージョン切り替えをコマンド一覧化しとく

# goenv
“`bash
# バージョン確認
go version
# インストールできる一覧
goenv install -l
# インストール
goenv install {バージョン}
# 設定
goenv global {バージョン}
# 指定のディレクトリにのみ設定する場合はこちら
goenv local {バージョン}
# .zshrcは読み直そう
source ~/.zshrc
“`

# nodebrew
インストールしてあれば `ls-remote` やら `install-binary` のくだりはいらない
“`bash
# インストールした一覧
nodebrew ls
# インストールできる一覧
nodebrew ls-remote
# インストール
nodebrew install-bina

元記事を表示

【Go】【チートシート】Slice Tricksの重要なとこだけ 〜忙しい人へ〜

# はじめに

前回は、スライスマスターになりたいので、Slice Tricks(チートシート)を作って見ました?

しかし、図が大きかったり、長く読みにくい記事を書いてしまったので、

前回記事にした記事の重要なところだけ(記事を書いていて学びの多かったところ)を抜粋しました!?

特に、忙しい人向けに、自分が重要だと感じるところを共有する記事(チートシート)です!?

元ネタ

https://github.com/golang/go/wiki/SliceTricks

# ? スライスの要素追加, 結合

1. `for _, i := range b {
a = append(a, i)
}`

2. `a = append(a, b…)`

“`go
s1 := []int{1, 2, 3}
s2 := []int{4, 5, 6}
for _, i := range s2 {
s1 = append(s1, i)
}

fmt.Println(s1) // [1 2 3 4 5 6]

s3 := []int{1, 2, 3}
s4 := []int

元記事を表示

Go言語におけるオブジェクト指向プログラミングについて

## はじめに
Go言語におけるオブジェクト指向プログラミングの基本的な概念について記載します。
Go言語は、クラスや継承といった伝統的なオブジェクト指向プログラミングの概念を持っていません。
その代わり、Goでは構造体(Structs)とインターフェース(Interfaces)という独自の概念を用います。

## 構造体とは?

Go言語の基本的なデータ型の一つが構造体です。これは関連するデータを一つにまとめるための型で、その中には異なる型のフィールドを持つことができます。以下に例を示します。

“`go
type Person struct {
Name string
Age int
}
“`
ここでは、`Person`という名前の新しい型を定義しています。この型は`Name`(文字列型)と`Age`(整数型)の2つのフィールドを持つ構造体です。

そして、この`Person`型の値を作成するには以下のようにします。

“`go
p := Person{Name: “Alice”, Age: 30}
“`

## メソッドとは?

Go言語では、特定の型に

元記事を表示

Google Cloud Workstationsの環境にリバースプロキシ経由でアクセスする

## はじめに

Goを使いちょっとしたリバースプロキシを書くことで、遠隔にあるGoogle Cloud Workstationsに立てたサーバーに対し、ローカルPCから`http://localhost:{port}`でアクセスできたので、その方法を紹介します。

## Google Cloud Workstations とは

Google Cloudが提供するフルマネージドな開発環境として使えるサービスです。

https://cloud.google.com/workstations?hl=ja

2023年5月に正式リリースされました。

https://www.publickey1.jp/blog/23/google_cloudcloud_workstationsbeyondcorp.html

特徴としては

* ローカルPCにソースコードを置くことなく、ブラウザやIDEからアクセスできるセキュアな開発環境を提供する。
* コンテナ定義として開発環境の設定を記述しておけるので、エンジニアは一貫した開発環境を利用できる。

などがあります。

## Google Cloud

元記事を表示

Go言語で基本的なCRUD操作を行うREST APIを作成

こんにちは。

今日はGo言語でCRUDのREST APIを作成していきます。

プロジェクト構成、単体テスト、Dockerイメージの作成など実際にREST APIを開発する上で必要だと思われる要素を盛り込みつつサンプルプロジェクトを作成していきます。

# はじめに

プロジェクト構成、単体テスト、Dockerイメージの作成など実際にREST APIを開発する上で必要だと思われる要素を盛り込みつつサンプルプロジェクトを作成していきます。
今回はできるだけ外部ライブラリやフレームワークを使わずにGo言語の標準機能のみで開発しました。
これからバックエンドにGo言語を使用することを検討されている方の参考になれば幸いです。
※この記事は既にGo言語の開発環境をセットアップ済みで基本的な文法を学習済みの方を想定しています。

# 動作環境

“`
PC : iMac
OS : macOS Ventura 13.3.1
Go : 1.20.6
Docker Desktop : 4.19.0 Engine : 23.0.5
MySQL : 8.0.33
“`

# プロジェクト構成

Go言

元記事を表示

Go言語でDockerで立てたPostgreSQLを操作してみた

作成:2023年7月12日
PosgreSQLの練習で、DockerでPostgreSQLを立てて、Go言語でアクセスしてみました。

# docker-compose.ymlを作成
“`:docker-compose.yml
# docker-composeで使用するバージョンを定義しています。2022年5月時点では、3.9が最新です。
version: ‘3.9’
# サービス (コンテナ) を定義します。
services:
# 今回は postgres をサービスとして定義しました。
postgres:
# Docker Image は postgres:12-alpine を使います。postgres:12-alpine は postgres:12 と比較して、イメージサイズが小さくなっています。
image: postgres:12-alpine
# コンテナの名前を指定します。
container_name: postgres
# 環境変数を設定します。
environment:
– POSTGRES_

元記事を表示

【備忘録】Go言語フレームワークechoを使ってAPIサーバーを構築する

# はじめに
Go言語を触れてまだ1週間ぐらいです。
echoがどのような特徴を持ったフレームワークなのかとかはまだちゃんと理解しているわけではありません。
自分用の備忘録であることにご留意ください。

# 開発環境
Go言語:version 1.20.6
OS:Windows10 Home 22H2
テキストエディタ:Visual Studio Code

# 準備
### 1.Go言語をインストールする
下記URLからGo言語をインストーラ―をダウンロードしてインストールします。

https://go.dev/dl/

Featured downloadsの中の一番左の項目「Microsoft Windows」をクリックしてダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511208/3c46ab45-fc40-f267-0ae9-05205202934c.png)
ダウンロードしたインストーラーを実行して、手順に沿ってインストールしていきます。
![i

元記事を表示

初心者からのGolang

# 前提
Goのコードを見て思ったこと、勉強するべき場所について思ったことを記載します。
対象者となり得る人はGo初心者ですが、他の言語で少しはコードを書いてきた人になるかと思いますので予めご了承ください。
※ご指摘いつでも承ります。

# 初めてGoと対峙
Goのコードを読んだ際に一番最初に思ったことは率直に全くわからないだった。
基礎を一通り勉強したはずだったのだが、、、、

では何が分からなかったのか、本当に必要な勉強はこれだったのではないか。
そんな話をしたい

## [第一関門]ポインタ周り
誰しもがつまづくであろう、ポインタ周り。
なぜ理解できないだろうと考えた際に `*` と `&` が見慣れないのに乱立すると頭が追いつかないという理由な気がする。
実際私もまだ完全な理解にはなっていない。

では改めてポインタとは何か? => **メモリのアドレス情報のこと**
参考:[Goで学ぶポインタとアドレス](https://qiita.com/Sekky0905/items/447efa04a95e3fec217f)

それがなんで必要になるの? => **引数やレシーバを

元記事を表示

【Go】【チートシート】Slice Tricksを作ってみた

# はじめに
スライスマスターになりたいので、Slice Tricks(チートシート)を作ってみました!!!?

元ネタはGo(Golang)公式Wikiにある[Go SliceTricks](https://github.com/golang/go/wiki/SliceTricks)です。

※以下では、Typeを( T )と略して書いています。
※自分の中で、よく使いそうなものに?をつけています。
※目次を見ながら、記事を見ていただけると見やすいかなと思います!!!?

# 1. スライスの定義 ・ 初期化
“`golang
// スライスの定義: 1
var s []int
fmt.Println(s) // []

// スライスの定義: 2
s = []int{1, 2, 3}
fmt.Println(s) // [1 2 3]

// スライスの定義: 3
s = make([]int, 3)
fmt.Println(s) // [0 0 0]

// スライスの定義: 4
s = make([]int, 3, 5)
fmt.Println(s) // [0 0 0]

元記事を表示

GolangとCloud SpannerでgRPC APIを構築する #1

この抜粋の内容は次のとおりです。

– Cloud Spanner Emulator の導入
– Spanner で CRUD
– gRPC API の実装: [connect-go](https://github.com/bufbuild/connect-go)

“`mermaid
flowchart LR
docker[“docker
emulator”]
devcontainer[“devcontainer
Go”]
devcontainer –>|host.docker.internal:9020| docker
“`

さらに詳しく知りたい方は読み続けてください。

2023年7月2回目です。

普段、ぼくたちの Database の第一の選択肢は、Cloud SQL です。

ですが、今後、可用性が求められるフェーズに対応するために、[Cloud Spanner](https://cloud.google.com/spanner?hl=ja) での開発について調査します。

– Cloud Spanner は、今のサ

元記事を表示

いまさらながらGo言語に触れる

## はじめに
タイトル通り、いまさらながらGo言語について学習し始めたので、記事として残します。

### Go言語とは

GoはGoogleが開発した静的型付けのコンパイル言語で、シンプルさと効率性を重視して設計されています。Goは非常に高速で、並行プログラミングをサポートしています。これは、CPUコアを効果的に利用して、高性能なアプリケーションを作成するために重要な特性です。

### プログラムの構造

Goのプログラムはパッケージとして組織されています。`main`パッケージは特別で、Goプログラムの実行は`main`パッケージから始まり、`main`関数から始まります。例えば:

“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello, world!”)
}
“`

このプログラムは”Hello, world!”と出力します。`fmt`は標準ライブラリの一部で、フォーマットされたI/Oを提供します。

### 変数と定数

Goでは、`var`キーワードを使って変数を宣言します。例えば:

元記事を表示

【godotenv】.envファイルへ環境変数をまとめる

## はじめに
Go開発にて、“`main.go“`で以下のようにハードコーディングしていたDB接続情報を“`godotenv“`を使って設定ファイルに書き出すように変更したのでメモしておきます。
“`golang:main.go
// DB 接続
func dbConnect() *gorm.DB {
DBMS := “mysql”
USER := “go_test”
PASS := “password”
PROTOCOL := “tcp(db:3306)”
DBNAME := “go_database”

“`

## 目次
[1. godotenv とは?](#godotenv-とは)
[2. .env ファイルの作成・読み込み](#env-ファイルの作成読み込み)
[3. 参考文献](#参考文献)

## godotenv とは?
設定(.env)ファイルへ環境変数を定義したい時に使用するライブラリです。
環境変数の定義および管理の煩雑化を防止できます。

以下でインストールを行います。
コマンド実行は、プロジェクトのルートディレクトリ

Go mongoDB接続のコード例

“`
package database

import (
“context”
“fmt”
“log”
“time”

“go.mongodb.org/mongo-driver/mongo”
“go.mongodb.org/mongo-driver/mongo/options”
)

func DBSet() *mongo.Client {
// MongoDBデータベースに接続するクライアントを作成します
client, err := mongo.NewClient(options.Client().ApplyURI(“mongodb://development:testpassword@localhost:27017”))
if err != nil {
log.Fatal(err)
}

// タイムアウト用のコンテキストを作成します
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

// クライアントがデータベースに接

gocsvで読み込んだデータに手を加えて構造体に入れたい

## やりたいこと
タグでcsvを読み取りたいのを大前提として、
csvの行としては分けられているデータを加工して(結合するなど)csvを読み込みたい
例として以下のようなcsvの姓と名を結合して構造体に持ちたいことがあった。
“`
姓,名,年齢,職業
山田,太郎,30,エンジニア
佐藤,花子,25,デザイナー
田中,一郎,35,医師
渡辺,和子,28,教師
高橋,健二,32,自由業
“`

## 実現手段
github.com/gocarina/gocsvの[UnmarshalBytesToCallback](https://pkg.go.dev/github.com/gocarina/gocsv#UnmarshalBytesToCallback)を使用する。
CSVの列に対応する構造体を定義しておいて、一度その形式でデータを受け取ってから欲しい形式に加工する形。

思ったよりは簡単に実装できるが実装サンプルが見つけられなかったので備忘録として。

## コード例
ヘッダ部分の諸々は省略
“`
type (
Person struct {
Name string
A

0から1ヶ月でサーバーサイドエンジニアになるための手順書

サーバーエンジニアになりたいという方のために
以下を元に要点の要点だけを抽出して、全体像がわかるような情報をまとめました。

# サーバーサイドエンジニアとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700428/091b9f41-92f2-39d8-f6bd-0f6ee1fe7e19.png)

ユーザーには見えない後ろ側の処理、サーバーの処理を実装するエンジニアです。 

# 言語選定

・Rust

・Go

・Java

・TypeScript

・C#

・Python

・PHP

・Ruby

あたりです。僕らはPython使ってます。

# フレームワーク選定

サーバーサイド開発にもフレームワークが存在します。有名所は以下です。

Rust: Rocketとか、Actix-Web

Go: Ginとか、Echo

Java: Spring Bootとか、Play Framework

TypeScript: NestJSとか、Express.js

C#: .

go + dockerでホットリロード機能を付ける

[DockerでGo言語の開発環境を作る方法](https://qiita.com/tkms13/items/74a9ea4b41302323c4b1 “go docker”)でDocker+goの開発環境を作りました。今回はさらにホットリロード機能をつけていきます。
# Dockerfileを修正
まず、Dockerfileに変更を加えていきます。Dockerfileの中身は以下の記事で取り上げたものをベースにしています。

https://qiita.com/tkms13/items/74a9ea4b41302323c4b1

“`docker
FROM golang:1.19.1-alpine3.16![スクリーンショット 2023-07-08 202755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/54c6704b-3ded-2479-6c9e-b478adf86990.png)

WORKDIR /app

COPY backend/go.mod .
COPY back

fmt.Printfの表示時にpanicしてもrecoverされる

# TL; DR

“`go
package main

import “fmt”

type Foo struct{}

func (f *Foo) String() string {
panic(“boom”)
}

func main() {
fmt.Printf(“%s”, &Foo{})
}
“`

“`:結果
%!s(PANIC=String method: boom)
“`

# はじめに

おなじみ `fmt.Printf` では、 `%s` を使うことで文字列形式で値を出力できます。
`%s` は、`string` や `[]byte` だけでなく、**`Stringer` の実装(`String() string` メソッドを実装している型)に対しても使用可能**です。Stringerを `%s` すると自動的に `String` が呼び出され文字列化されてから出力されます。

# Stringがpanicしたら?

ここで、`String` メソッド内でpanicした場合の挙動が冒頭のコードです。

“`go
func (f *Foo) String

エンコードとデコード

エンコード(Encode):
エンコードは、データを別の形式や表現方法に変換する処理です。エンコードの目的は、データを特定の形式に合わせて変換し、保持や転送、または他の処理に適した形式にすることです。エンコードの結果は、通常、テキスト、バイナリ、またはその他のフォーマットで表現されます。

例えば、JSONエンコードでは、オブジェクトや構造体のデータをJSON形式のテキストに変換します。XMLエンコードでは、データをXML形式のテキストに変換します。エンコードには、データのシリアライズ(直列化)、圧縮、暗号化などが含まれる場合があります。

デコード(Decode):
デコードは、エンコードされたデータを元の形式に戻す処理です。データのデコードには、通常、特定の規格やフォーマットに従った解析が必要です。データがエンコードされると、元のデータは別の形式に変換され、しばしばバイナリ形式やテキスト形式で表現されます。デコードの目的は、エンコードされたデータを解読し、元のデータの意味や値を復元することです。

例えば、JSONデコードでは、JSON形式のデータを元のデータ構造に変換します。XM

func VerifyPassword(userPassword string, givenPassword string) (bool, string) { // 関数の本体 } の意味

“`go
func VerifyPassword(userPassword string, givenPassword string) (bool, string) {
// 関数の本体
}
“`

この関数は、2つの文字列引数 userPassword と givenPassword を受け取ります。これらの引数は、関数呼び出し元から提供されるパスワードの情報です。

関数の戻り値は2つあります。1つ目の戻り値は bool 型で、パスワードの検証結果を表します。true の場合はパスワードが正しいことを示し、false の場合はパスワードが正しくないことを示します。

2つ目の戻り値は string 型で、追加の情報を提供します。この文字列は、パスワードが正しくない場合にエラーメッセージなどを格納するために使用されます。

関数本体では、受け取った2つのパスワードを比較し、一致するかどうかを判断します。パスワードが一致する場合は、最初の戻り値に true をセットし、2番目の戻り値に空の文字列を返します。パスワードが一致しない場合は、最初の戻り値に false をセットし

GCP学習記 Cloud Functions編(1)

# はじめに
本格的なWEBアプリを作って、他の人たちに使ってもらうとなると、やはりクラウドにバックエンドを構築して利用できるようにした方がいいと思い、GCPの学習を始めた。
そこで、複数回に分けて、GCPの学習記録を投稿していきたいと思う。

第1回目は、バックエンドの関数をクラウドにデプロイできる、Cloud Functionsについて。
(今回はちょっとだけ。)

# 対象者
* GCP初心者
* すでにGCPのアカウントは持っている。
* 開発環境はMacとVSCode
* 開発言語はGo

# まずは環境構築
## 1. Goをインストール
こちらについては、ネット上にいろんな記事があるので今回は割愛する m(_ _)m。
## 2. サンプルのプロジェクト(モジュール)を作成する。
ターミナルを使って、モジュール用にディレクトリを作成する。
“`.ターミナル
mkdir demoapi
“`
作成できたら、`cd`コマンドで作ったディレクトリに移動する。
“`.ターミナル
cd demoapi
“`
## 3. goをモジ