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

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

【忙しい人のための】 Security Best Practices for Go Developers

あなたのGoで書かれたプロジェクトは[go.dev](https://go.dev/)が提唱するセキュリティベストプラクティスに従っていますか?
実は、GoのチームはGo開発者のためのセキュリティベストプラクティスを公開しています。

これ↓

https://go.dev/security/best-practices

一次情報を読むことをお勧めしますが、英語が苦手な人や、サクッと概要だけ見たい忙しい人も多いと思ういます。

そんなあなたのために、心優しい私が要約しましたので活用してください。

## ソースやバイナリに脆弱性スキャンをする

– [govulncheck](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck)を使って脆弱性を検知する
– [チュートリアル](https://go.dev/doc/tutorial/govulncheck-ide)
– Govulncheck は CI/CD フローに組み込むこともできる
– GoチームはGitHubマーケットプレイスに[govulncheckのためのG

元記事を表示

Go言語の並行処理: ゴルーチンとチャネルについて

この記事では、Go言語の並行処理について記載します。
Go言語は、複数のタスクを同時に実行するための強力な機能を持っています。
その実現には、ゴルーチン(Goroutines)とチャネル(Channels)という2つの主要な概念がキーとなります。

## ゴルーチンについて

ゴルーチンは、軽量なスレッドのようなもので、Goランタイムによって管理されます。ゴルーチンは非常に少ないメモリ(数KB)を使用し、必要に応じて成長・縮小します。これにより、数千から数百万のゴルーチンを同時に実行することが可能となります。

新しいゴルーチンは、`go`キーワードと関数呼び出しを組み合わせることで作成されます。

“`go
go doSomething()
“`

上記のコードは、新しいゴルーチンを作成し、その中で`doSomething`関数を非同期に実行します。

## チャネルについて

チャネルは、ゴルーチン間での通信と同期を可能にするデータ構造です。一つのゴルーチンはチャネルにデータを送信し、別のゴルーチンはそのチャネルからデータを受信することができます。

チャネルは、`make`関

元記事を表示

[GCP] Cloud Run 機能調査x実装

[Cloud Run](https://cloud.google.com/run)は、Google Cloud Platform(GCP)のサーバーレスコンピューティングプラットフォームであり、コンテナ化されたアプリケーションを実行するための環境を提供している。以下にCloud Runの概要と主な機能について説明する。

## Cloud Runの概要
Cloud Runは、ステートレスなコンテナによって構成されるアプリケーションの実行を可能にします。Cloud Runでは、コンテナイメージを提供してアプリケーションをデプロイするだけでなく、自動スケーリング、リクエストトリガー、イベントの統合などの機能を利用することができる。また、Cloud RunはKnativeの上に構築されており、ノードレスなアプリケーション実行環境として機能する。

## Cloud Runの機能
### 1. ステートレスな実行環境
Cloud Runはステートレスなコンテナ実行環境であり、ステートフルなコンポーネントを含むアプリケーションを実行することはできない。ステートレスな実行環境のため、インスタンスの

元記事を表示

Go言語の例外処理がないってのは結局どういうこと?

# はじめに
はじめまして。インターンをしているイナです。
今回は初心者がGo言語の例外処理がないって本当なの?という部分について概念を中心に調べたものをまとめました。

# Q. 例外処理とは
まずは兎にも角にも、例外処理とはなんぞやってところからです。
いくつかのサイトで例外処理の定義について調べてみましたが、サイトによって言ってることはバラバラでした。
例外とエラーは一緒です or 違います!例外は想定外 or 想定内&想定外のエラーのことです!など人によって言ってることが違いました。

最初から壁が高すぎ…?と戦々恐々としていましたが、[IT用語辞典 e-Word](https://e-words.jp/w/%E4%BE%8B%E5%A4%96%E5%87%A6%E7%90%86.html)で気になる部分がありました。

> 例外は「エラー」(error)と同種の概念で、普遍的に成り立つ両者の明確な違いは無く、同義として扱われる場合が多い。ただし、プログラミング言語や処理系によっては両者に異なる意味合いが与えられている場合もある。

こちらの内容に関しては、まとめてくださっ

元記事を表示

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

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