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

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

Golangの開発生産性を上げるVSCodeスニペットランキング

この記事では、Golang用のVSCodeユーザースニペットの中で自分が特に役に立っていると思うものをランキング形式で発表します!

# 前提:

### VSCode ユーザースニペットとは
コードとキーを予め登録することでキー入力するだけで設定したコードが簡単に呼び出せる機能です。
キーボードソフトの辞書機能に似ていて、特定のキーワード入力で予め設定されたコードが挿入されると考えていただけるとわかりやすいと思います。

## VSCode ユーザースニペット 登録方法

⌘ + Shift + P で検索フィールドを展開し、`snippets` を入力すると候補にあがってくるのでクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262578/75e71a57-d97c-19a9-b3da-930d94e0c8ca.png)

以下のような画面が出てくるので go.json をクリック。
存在しない場合は New Snippets のところから go を選択して作成して

元記事を表示

型システムから考えるPython, Java, Golangそれぞれの違い

# 初めに

## 背景

今までPythonを使ってきたのですが、転職先ではJavaとGolangを主に使用することになりました。特にPythonにはない型を意識した開発のメリット、JavaとGolangのintefaceの違いがあまりよく分からなかったので、調べてみました。
この記事では、PythonとJavaとGolangの違いについて触れ、そして記事の最後には GolangとJavaのintefaceを違いを明示しつつ、Pythonで書き直してみました。

## 対象読者

* 動的型付け言語しか使ったことない人
* JavaとGolangの違いがはっきり分からない人
* 型を意識したことがあまりない人

## シンプルな実装

まず、Python, Java, Golangの3つで一番シンプルなクラスを書いてみる。
Pythonは以下を見てもらうと分かる通り、Pythonを知らない人でも、理解できてしまうぐらいシンプル。

Pythonの場合

“`python:simpleなクラス(python)
clas

元記事を表示

色々な言語で簡単なREPLを実装する #golang

続きです。

# REPLとは
[こちらの記事](https://qiita.com/runeleaf/items/7615afd7abc79c9b3c01)を参照してください。

## Goで実装する

main.go
“`golang
package main

import (
“bufio”
“fmt”
“os”
)

func main() {
scanner := bufio.NewScanner(os.Stdin)
cmd:
for {
fmt.Print(“go> “)
if !scanner.Scan() {
break
}
prompt := scanner.Text()
switch prompt {
case “exit”:
fmt.Println(“Bye!”)
break cmd
default:
fmt.Println(prompt)
}
}
}

“`

## 実行する

“`bash
$ go mod edit -module=example.com/app
$ go buil

元記事を表示

「無害」なdata raceについて

## 概要

Goの「無害」なdata raceについてはたしてそれは実際には無害なのか、避けるべきなのか例を交えてまとめている

## 結論

「無害」なdata raceも避けるべき

## そもそもdata raceとは?

二つ以上のスレッドが同じ変数(メモリ)に対して同時にアクセスし、少なくとも一つのスレッドが書き込みの場合に発生する状態のこと

参考:https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E7%AB%B6%E5%90%88

### data raceの例

典型的な例で言うと、以下のように二つのgroutineからcount変数に対してアクセスする場合、

以下は0,1,2,3,4,5,,と表示されるわけではない

おそらく(タイミングによって変わる)0,0,0,0,1,,1,1,1,1みたいに表示される

“`go
package main

import (
“fmt”
)

func main() {

var count int
ch := make(chan bool)

g

元記事を表示

バックエンドをGoからRailsに切り替えたお話

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

背景はこちらに記載しています

# バックエンドをGoからRailsに切り替えたお話
## やったこと
環境構築の記事を以前投稿しています。

https://qiita.com/does_not_exist/items/19c35639e466844e8b0e

https://qiita.com/does_not_exist/items/23a70dab286ed146b05f

https://qiita.com/does_not_exist/items/b79b3fd51ea6ef39df23

## 気づいたこと
環境構築はGoよりRailsの方が少し早くできたような気がします。
Rails側でよしなに設定してくれる箇所が多いからだと思います。Goはポインタや構造体という概念があるので理解に時間がかかったりしました。コードの書きやすさ、可読性でいえばGoの方が良いのかなという感触でした。

# おわりに
RailsもGoもさらに触れていき、状況に応じて技術選択できるようになりたいで

元記事を表示

【Go言語】シャドーイング

## シャドーイングとは
異なるスコープで同じ名前の変数が使用される場合に発生することがある
具体的には、異なるスコープで`:=`演算子を使って再宣言された変数はスコープ外の値に影響を及ぼさない

意図せずに異なる変数にアクセスしてしまう可能性があるので、注意が必要になる

### サンプル

“`go
package main

import “fmt”

func main() {

num := 10
if true {
num := 20 // シャドーイングが起きる
fmt.Println(num) // 20
}
fmt.Println(num) // 10

if true {
num = 30 // シャドーイングが起きない
fmt.Println(num) // 30
}
fmt.Println(num) // 30
}

“`

## シャドーイングを避ける方法

1. `:=`の代わりに`=`を使う
1. shadowを利用する
使用方法は以下の記事が参考になる
* https://engineer-

元記事を表示

制約で固められた環境をできるだけモダンに踏み倒す

# はじめに
こちらは[**klis(筑波大学情報学群知識情報・図書館学類) Advent Calendar 2023**](https://adventar.org/calendars/8957) 4日目の記事です!
klisのアドベントカレンダーに参加するのは初めてです!よろしくお願いします〜

## 自己紹介

本年度から長野高専より3年次編入しました**Bony_Chops**と申します!Web系の技術に興味があります

https://bonychops.com

# 前置き
自分は[データベース技術](https://kdb.tsukuba.ac.jp/syllabi/2023/GE70901/jpn)という科目を履修しており、その授業では最終成果としてDBを用いたWebサービスを開発します。
成果物は授業で提供されるVPSを使って動かします。以下のような環境・制約です(一部セキュリティの都合上あえて曖昧な表現をしています)。

– VPS
– OS: Linux系統(amd64)
– 接続方法: SSH
– PHP/HTML/CSS/JS

今回は、この授業の環境でなるべ

元記事を表示

Next.js+Go+MySQLの環境をDockerで構築する

# はじめに
この記事では、frontend、backend、dbのコンテナを作成しコンテナ間通信が出来るようにする所まで説明しています。
ですので、それぞれの層での実装までは行わないので、予めご了承ください。🙇
## 環境
Docker : v24.0.6
Docker Compose : v2.23.0-desktop.1

## 構成図
“`
.
├── docker-compose.yml
├── backend
│ ├── Dockerfile
│ └── app
│ └── main.go
├── frontend
│ ├── Dockerfile
│ ├── app
│ ├── public
│ ├── node_modules
│ ├── .eslintrc
│ ├── next-env.ts
│ ├── next.config.js
│ ├── package-lock.json
│ ├── package.json
│ ├── postcss.config.js
│ ├── README.md

元記事を表示

Goにおけるポインタ操作

# ポインタを学ぶ
3日目はポインタについてです。
Go言語においてポインタは非常に重要な概念です。

“`go
package main

import “fmt”

func main() {
i, j := 42, 2701

p := &i // point to i
fmt.Println(p) // 0x1400009c018
fmt.Println(*p) // read i through the pointer
*p = 21 // set i through the pointer
fmt.Println(i) // see the new value of i

p = &j // point to j
*p = *p / 37 // divide j through the pointer
fmt.Println(j) // see the new value of j
}
“`

実行する前に挙動を考えてみることにします。

変数pに変数iの番地を代入しています。
“`go

元記事を表示

Rust vs. Go: About Vulnerability Management

Rust / Go のセキュリティについて考える。

依存関係の管理が重要になる。

特に、コードを流用する場合は、`Cargo.toml` の内容は注意が必要。

依存関係については、Node.js にも同じことが言える。

共通で使える scanner について調べる。

– [OSV‑Scanner](https://github.com/google/osv-scanner)
– [Trivy](https://github.com/aquasecurity/trivy)

他にもあると思うが、事例や汎用性を考えてこの 2 つについて調べる。`cargo audit` は置いておく。

## Environment
– dev container
Rust と Go が使える状態。

https://github.com/danny-yamamoto/rust-api-samples/blob/main/.devcontainer/devcontainer.json

## Installation
– OSV‑Scanner
[Docs](https://osv.dev/)

元記事を表示

【Go言語】リテラル・変数宣言

## リテラル
Goのプリミティブなリテラルでよく使われるもの
* 整数
* 浮動小数点数
* ブール型
* 文字列
* nil
> `nil`は無効な参照先を表す値で、初期化されていない状態を表すのに利用される

“`go
// 整数
1
// 浮動小数点数
1.5
// 文字列
“あいう”
`Hello
World`
// プール値
true
false
// nil
nil
“`

## 変数宣言
`var`の後に`変数名`、`型`で宣言する
初期値を代入する場合は、`=`の後に`初期値`を記述する
初期値の値から型が明らかな場合は、`型`を省略できる

“`go
// 整数型の宣言
var num1 int = 10

// 右辺から型が決まるので型の記述を省力できる
var num2 = 20
“`

変数名と初期値の代入を`:=`演算子で行うことができる
ただし、関数の中でしか使えない

“`go
package main

import “fmt”

// コンパイルエラーになる
num1 := 10

func main() {
// num2に整数を

元記事を表示

GoでAPIサーバーを立てよう!(Ruby on Railsと比較しながら)

# 概要
Ruby on Railsしかバックエンド触ったことがない筆者がはじめてGoでAPIサーバーを立てた時、「Railsと比較しながら理解すれば理解しやすいのでは・・・!」と思いせっかくなら記事にしようと思い立って記事にした。

# まず最初に、RailsでAPIサーバーを動かすイメージを・・・
まず、RailsでAPIサーバーを動かす時、どうやって実装してサーバーを動かしていたかイメージします。
文字にするとこんな感じでしょうか。
1. rails sするとlocalhost:3000にサーバーが立ち上がる
2. routes.rbにルーティング(エンドポイントと対応するコントローラー, アクション)を定義する
3. コントローラーのアクションの中身を書く(DBの読み込み、書き込み、レスポンスの返却…etc)

GoでAPIサーバーを立てるときも基本的にやることは変わらず、この通り進めていけば問題ないです。

# じゃあ実際にGoでAPIサーバーを立ててみようか
んじゃ、実際にやってみましょう。

## 1. Goの環境を立ち上げる
railsでいうところのrails ne

元記事を表示

YAML形式のKubernetesマニフェストをGo言語のオブジェクトにデシリアライズする

::: note info
これは [ZOZO Advent Calendar 2023](https://qiita.com/advent-calendar/2023/zozo) カレンダー Vol.5 の 3日目の記事です。
:::

本記事ではYAML形式のKubernetesマニフェストを読み込み、対応する型を持ったGo言語のオブジェクトにデシリアライズする方法を説明します。

`k8s.io/apimachinery`モジュールが提供する`yaml`パッケージの機能を利用することでこれを実現できます。

# 実装例と解説
以下は、YAML形式で書かれたPodのマニフェストファイルを読み取り、`core/v1`の`Pod`型を持つオブジェクトにデシリアライズし、[`client-go`](https://github.com/kubernetes/client-go/tree/master)を使ってGo言語のオブジェクトからKubernetesのPodオブジェクトを作成する例になります。この例で作成するPodは次の2種類になります。

1. 元々のマニフェストのフィールド値

元記事を表示

Goで簡易WEBサーバを作成

# 記事概要
簡易WEBサーバを作成。

# スクリプト
“`go
package main

import (
“log”
“net/http”
“net/http/httputil”
“net/url”
“os”
)

func main() {
port := “8080” // デフォルトのポート番号
ip := “0.0.0.0” // IP

// コマンドライン引数からポート番号を取得
if len(os.Args) > 1 {
port = os.Args[1]
}

// / へのアクセスが来た時に dist フォルダ内のコンテンツを表示するハンドラを設定
http.Handle(“/”, http.FileServer(http.Dir(“./dist”)))

// /hoge へのアクセスが来た時にリダイレクトするハンドラを設定
http.HandleFunc(“/hoge”, func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, “http:

元記事を表示

宮廷プロファイラの紹介

# 宮廷プロファイラの紹介

## リポジトリ

devcontainerを用意しているので、

1. VSCodeで「コンテナーでフォルダを開く」
2. .env.templateの中身を変更して.envにリネーム
3. “`go run cmd/main/main.go“`

で動きます。
DiscordBotなので、

で、TOKENを発行する必要があります。
権限はCommandとAdministratorを渡しておけば大丈夫です。

## 概要

ISUCON用に作成したpprofのプロファイル結果をS3にアップロードするDiscordBotです。
ISUCON当初はプロファイルの画像をDiscord上にあげていましたが、
将来的にもっと詳細なプロファイルを取得したいのと、Webページでいろいろ見れるようにしたいのでS3にアップする方針にしました。

(イメージは以下のサイト。ISUCO

元記事を表示

echoで作るGo製Webサーバー

## echo
アドベントカレンダー2日目です。1日目は[こちら](https://qiita.com/shuyaeer/items/8b9f44c3f72615cb0548)
`echo`でwebサーバーを作ります。

https://github.com/labstack/echo

`echo`の特徴
“`
ルートを賢く優先する最適化されたHTTPルーター
堅牢でスケーラブルなRESTful APIを構築
APIのグループ化
拡張可能なミドルウェアフレームワーク
ルート、グループ、またはルートレベルでのミドルウェアの定義
JSON、XML、フォームペイロード用のデータバインディング
様々なHTTPレスポンスを送信するための便利な機能
集中化されたHTTPエラー処理
任意のテンプレートエンジンでのテンプレートレンダリング
ロガーのフォーマットを自由に定義
高度にカスタマイズ可能
Let’s Encrypt経由での自動TLS
HTTP/2サポート
“`

## echoのインストール
“`bash
docker-compose exec golang /bin/bash
“`

元記事を表示

Render.comを使ってGo&PostgreSQLを爆速でデプロイしてみた

こんにちは!
Go&PostgreSQLを思ったより簡単にデプロイできたので参考になれば幸いです

## こんな方におすすめ
– より手軽にGoとPostgreSQLをデプロイしてDBから取得、保存等ができるようになりたい

### この記事で扱わないこと
– Goの文法に関して
– 各種サイトやツールのインストール方法

## 今回使用するGoファイル
こちらの記事で実装したGoファイルを使います

https://qiita.com/miumi/items/6a70d5b9a1a61cc39dc8

リポジトリは下記になります

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

## render.comのアカウント作成
下記サイトにアクセスします。

https://render.com/

アカウント作成の流れは下記の記事が参考になると思います

https://zenn.dev/protoout/articles/54-howto-render-setup

## デプロイ用のPostgreSQL作成
https://

元記事を表示

Go言語の環境構築~HelloWorld出力(Windows)

## はじめに
WindowsでGo言語の開発環境を構築し、`HelloWorld`を出力する方法を説明する

## Goのインストール
1. https://go.dev/dl/ にアクセスして`go1.21.4.windows-amd64.msi`をダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/a36570e9-0a89-74c1-2eaa-f82746f0b532.png)

1. ダウンロードが完了したら、`go1.21.4.windows-amd64.msi`をダブルクリック
1. `Next`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/5f5ae292-b661-eb49-d36a-0e2b4feac0f2.png)
1. `Next`をクリック
![image.png](https://qiita-image-s

元記事を表示

KubernetesOperator に入門してみた

## はじめに

本記事は [ラクスパートナーズアドベントカレンダー 2023 2日目](https://qiita.com/advent-calendar/2023/rakus-partners) の投稿です。

数年前から話題だったようですが、私は最近プロジェクトで触れる機会があり、遅ればせながら KubernetesOperator に入門したので個人的な備忘もかねて投稿します。
私はバリバリインフラ系のため、Go については完全素人でしたが後述の operator-sdk があったおかげで何とか作り上げることができました。ありがたや。。

## そもそも KubernetesOperator とは
ざっくり簡単に言うと
「Kubernetes リソースの作成を自動化してくれるプログラム」です。

CustomResource をアプライすることで Cluster 内に起動した KubernetesOperator がそれを検知し
KubernetesOperator 内で定義してある Deployment や NameSpace 等のリソースを自動でクラスターに起動してくれます

元記事を表示

変数宣言とスコープの取り扱いに気をつけよう

# はじめに

こんにちは。Nubです。

研究や個人開発でオレオレ開発を行っていた私ですが、遂にコードレビューをしていただくことになりました。年貢の納め時です。

今回は、Go言語での変数やプログラムのスコープについて絞って書いていこうと思います。

## 要約

– 変数はlowerCamelCaseで宣言しましょう
– 変数はなるべく使う直前で宣言しましょう
– スコープ内ですべてを完結させるのは、逆に可読性を落とす可能性があるので気をつけましょう

# 変数の命名方法

![名称未設定のデザイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477712/e4a4360a-51bd-8879-6460-b4722bc0da1c.png)
問 : これな〜んだ?
解 : 命名規則

プログラム内で変数や定数を宣言する上で、命名方法には様々な種類があります。

– `UpperCamelCa

元記事を表示

OTHERカテゴリの最新記事