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

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

【Go言語】スライスとポインタ

# はじめに

Goのスライスを使う上での注意点をよく忘れるので、自分でまとめました。appendやcopyなどを何も考えずに行うと、メモリリークが起きたり、意図しない動作になる可能性があります。また、v1.21以降では、slicesパッケージが追加されたので、そちらについても少し触れております。

# 例題

さて、突然ですが以下のコードを実行するとどうなると思いますか?

“`go:sample1
func main() {
slice1 := make([]int, 0, 5)
slice2 := slice1
for i := 0; i < 10; i++ { slice1 = append(slice1, i) slice2 = append(slice2, i+100) } fmt.Println("slice1 =", slice1) fmt.Println("slice2 =", slice2) } ``` [Go Playground](https://go.dev/play/p/gVXo9n1FPBB) 実行すると、以下のような結果になりま

元記事を表示

ローカルのDockerコンテナをEC2へデプロイしてみる

## やりたいこと
ローカルで構築したDockerコンテナをEC2上にデプロイして実行する

## 材料
* EC2
* FSx for windows
* Docker
* Amazon Elastic Container Registry (ECR)
* ローカルGo環境
* AWS CLI

## レシピ

### 1.AWS CLIをインストール

“`
# 例:Macでhomebrewを使用
% brew install awscli
“`

### 2.EC2を作成
![スクリーンショット 2024-05-18 11.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17764/db88bfdc-cea0-f680-a429-cfb8551c59d8.png)

キーペアを作成した場合はダウンロードしたpemファイルのパーミッションを変更
(ローカル環境)
“`
% chmod 400 keypar.pem
“`

### 3.必要なパッケージをインストール
(EC2)

`

元記事を表示

Go言語学習記録

## はじめに
昨年Go言語を習得しました.この記事では私がどのようにGo言語を習得したのか,参考にした本や記事,Go言語への感想などについてつらつらと書き記します.

## 動機
まず私がなぜGo言語を習得しようと思ったか,主たる動機はバックエンド開発言語のスタックを増やしたかったからです.
それまでにバックエンドの開発言語としてPHPやKotlinを使用していました.
しかしインターンなどの募集が少ないことや実行速度の遅さ,コーディングスタイルが合っていなかったことから別の言語を探していたところGo言語に出会いました.
Go言語と出会い私は一目惚れしました.
シンプルで見やすく書きやすいコード,コンパイル速度の速さ,応答速度の速さなどGo言語の特徴すべてが私にマッチしているような,そんな気分でした

https://go.dev/

## 学習
Go言語入門としてまずは公式の[A Tour of Go](https://go.dev/tour/welcome/1)から始めました
それまで.Net開発などでMicrosoftにお世話になっていたので同時に[Microsoft Lear

元記事を表示

[Go] grepコマンドを一部実装してみる

# はじめに

前回は、`ls`コマンドの一部実装に取り組んでみました。今回は、`grep`コマンドの一部実装に取り組んでみます。
目標としては、
1. 検索文字列が出現する行を出力し、その検索文字列は区別できるように色づけてあげること
2. `-n`オプションで出現位置の行数も出力するようにすること

の2つを設定したいと思います。

前回の記事はこちらから

https://qiita.com/taga3_dev/items/1dd46c3593d1a414dc32

# 実装
今回のリポジトリですmm

https://github.com/ayanami77/go-my-commands/blob/main/my-grep/main.go

まず、1つ目の「 `my-grep sample.txt`で検索文字列が出現する行を出力すること」を実装してみます。ポイントは、`Scanner`を用いて、一行ずつテキストを読み込み、対象の文字列が含まれているか走査している点です。また、対象文字列の色付けには`fatih/color`というライブラリを拝借させていただ

元記事を表示

Go + Reactでアプリを作成してみた【Todo】

## technology used

– Go – Server
– Fiber – Go web server
– Vite – Client
– Mantine – React component library
– TypeScript – Static types

## Serverを作成する

“`NOTES.md
## Create a Server folder

mkdir Server

## initialize Go app

go mod init github.com/tomdoestech/go-react-todo

## Install Riber v2

go get -u github.com/gofiber/fiver/v2

## Create client app with Vite

yarn create vite client — –template react-ts

## Install dependencies

yarn add @mantine/hooks @mantine/core swr @primer/octic

元記事を表示

[Go] lsコマンドを一部実装してみる

# はじめに
Goを勉強したいので、手始めに`ls`コマンドを一部実装してみようかなと思います。今回は、`ls`でファイル名の一覧が表示されること、またオプションは、`-l`でファイルの詳細一覧が出力されることを目標として設定します。

# 実装
今回のリポジトリですmm

https://github.com/ayanami77/go-my-commands/blob/main/my-ls/main.go

では最初に、`ls`を実装していきます。ポイントは、`os`ライブラリが提供している`os.Getwd()`でカレントディレクトリのパスを取得し、`os.ReadDir()`でディレクトリ内のファイルを全て返して、ファイル名を出力しているようにしている点です。

“`main.go
package main

import (
“fmt”
“os”
)

func main() {
dir, err := os.Getwd()
if err != nil {
panic(err)
}
files, _ := os.ReadDir(dir)

listFiles

元記事を表示

ローカルのAWS Lambda開発環境を整える(hot reload)

ローカルでLambdaの開発をやるために環境を整備したのでやったことを残しておきます。

zenn にも全く同じ内容を書いています。

https://zenn.dev/imishinist/articles/8ff24429f0eb41

今回作成したサンプルの全体コードはこちらのリポジトリです。

https://github.com/imishinist/lambda-sample

## できること
1. ローカルに立ち上げたDockerでAWS Lambdaを動かす
2. 手元からcurlでLambdaを呼び出す
3. ビルド時に自動でLambdaを更新する(hot-reload)

### 動かし方

Goのコード(Lambdaのハンドラ)をビルドしたいときは以下の `make` を実行する。

“`bash
make build-lambda
“`

Lambdaを立ち上げたいときは `docker-compose` で起動する。

“`bash
docker compose up -d –build
“`

## 仕組み

### AWS Lambda を

元記事を表示

Go でアプリを作成してみた【API 開発】

## Dependency Setup

① Go Moduleを初期化する
“`
go mod init example.com/myproject
“`
② Ginのインストール
“`
go get github.com/gin-gonic/gin
“`
## Imports & Data Setup

“`main.go
package main

type book struct{
ID string `json:”id”`
Title string `json:”title”`
Author string `json:”author”`
Quantity int `json:”quantity”`
}

var books = []book{
{ID: “1”, Title: “In search of Lost Time”, Author: “Marcel Proust”, Quantity: 2 },
{ID: “2”, Title: “The Great Gatsby”, Author: “Scott Fitzgerald”, Quan

元記事を表示

【初心者向け】Stripeでクレカ登録・決済・削除を実装する【Python, Go, Javascript】

こんにちは、[わいけい](https://twitter.com/yk_llm_gpt)です。
今回の記事ではStripeを使ってクレジットカード決済を実装します。

## 前置き
開発規模の大小を問わず、**実装したプロダクトで収益を得るにはユーザーからお金を払ってもらう必要があります。**
しかし、決済の仕組みを自分たちで実装するのは色々な困難が伴います。

キャッシュレス決済といえばクレジットカードですが、クレカ決済の実装には例えば下記のような課題があります。

– 実装ミスなどで、ユーザーのクレカ情報が流出すると大事故になる
– PCI DSSというセキュリティ要件を守り、決済ブランドの審査に通過するには莫大なコストがかかる

結論として、個人や小規模な企業がクレカ決済を独自実装するのはあまり現実的ではないと私は思っています。
こういった問題のソリューションとなるのがStripeです。

私のSNSアカウント等です。
今後もPython・LLM・Go・Web開発などのトピックについて発信していくのでフォローしていただけると喜びます。

X: [わいけい](https:

元記事を表示

Goでwebアプリケーションを作成してみよう! 第3回 ~フロントエンドの実装~

この記事では5回に分けてwebアプリケーションの作り方を説明していく
第1回
 [webアプリケーションの構成、仕組み](https://qiita.com/Yutosaki/items/0c6f9349b427d4aee08e “第3回”)
第2回
 [サーバー立ち上げ](https://qiita.com/Yutosaki/items/fcd773a278e9b8663f36 “第2回”)
第3回
 フロントエンドの実装(この記事)
第4回
  [バックエンドの実装](https://qiita.com/Yutosaki/items/da564b74d6fac87aa601 “第4回”)
第5回
メニュー画像の読み取り

実際に作ったアプリケーション

https://github.com/Yutosaki/WiFiRader

# やること
以下のような画面構成にするための JavaScript を書く。また、Go で作成するアプリケーションサーバーに HTTP リクエストを送る。

![今回作成した画像](https://github.com/Yutosa

元記事を表示

【Go】エラーの場合は返り値として空の構造体を返す?nilを返す?

## はじめに

以下のようなコードで、`err != nil`のとき、

ある関数では`models.Article{}`と空の構造体を返しているのに対し、

“`go
func PostArticleService(article models.Article) (models.Article, error) {
// 略
newArticle, err := repositories.InsertArticle(db, article)
if err != nil {
return models.Article{}, err
}

return newArticle, err
}
“`

別の関数では(**空のスライス`[]models.Article{}`ではなく**)`nil`を返しています。

“`go
func GetArticleListService(page int) ([]models.Article, error) {
// 略

articleList, err := repositories.SelectArtic

元記事を表示

Goでwebアプリケーションを作成してみよう! 第4回 ~バックエンドの実装~

この記事では5回に分けてwebアプリケーションの作り方を説明していく
第1回
 [webアプリケーションの構成、仕組み](https://qiita.com/Yutosaki/items/0c6f9349b427d4aee08e “第3回”)
第2回
 [サーバー立ち上げ](https://qiita.com/Yutosaki/items/fcd773a278e9b8663f36 “第2回”)
第3回
[フロントエンドの実装](https://qiita.com/Yutosaki/items/1058dea6e2246b650c7e “第3回”)
第4回
  バックエンドの実装(この記事)
第5回
メニュー画像の読み取り

実際に作ったアプリケーション

https://github.com/Yutosaki/WiFiRader

# やること
JSON 形式で送られてきた現在地と希望金額の情報から、近場のWi-Fiのある場所で、かつ希望金額以下のメニューがあるところのデータを送信する。
構成としては3つに分けられ、
1つ目が受け取ってきたデータを処理する部

元記事を表示

AWS Health 組織ビューの情報をCSV出力するCLIツールをつくりました

:::note info
本記事で紹介しているツールは AWS Health API を使用しています。AWS Health APIを使用するには、ビジネスプラン以上の AWS Support 契約が必要です。
:::

## はじめに
全国の AWS Organizaitons 管理者の皆さん、AWS Health に通知されるイベントの管理はどうされていますか? AWS を利用していると日々様々な通知が飛んでくるのではないかと思います。

これらのイベントは、システムの可用性や信頼性に影響を与える可能性があるため、適切に管理する必要があります。直近では Amazon RDS の証明書更新 (8月) や AWS Lambda の Python 3.8 ランタイムバージョンのサポート終了 (10月) など大きなイベントも待ち構えています。

組織内で多数のアカウントを管理している場合、手作業でイベントを確認し、必要な情報を収集するのはそれなりに手間がかかるのではないでしょうか。

## AWS Health Exporter という CLI ツールをつくりました

https://gi

元記事を表示

密っこくん

# 目次
[1. 概要](#1-概要)
[2. 背景](#2-背景)
[3. 技術スタック](#3-技術スタック)
[4. アプリの詳細](#4-アプリの詳細)
[5. GitHubリポジトリ](#5-githubリポジトリ)
[6. まとめ](#6-まとめ)
# はじめに
 このアプリは**Golang**と**Websocket**による**双方向通信**を学びたいというモチベーションのもと、唐突な思いつきで作成したアプリです。(現在もまだ修正中。最終的には一時的にでもデプロイしたい。)
**やさしい目**で見てもらえると嬉しいです。
 とりあえずアプリの発信のために本記事を書いてます。
**(※使用する場合はリポジトリの注意書きを参照して下さい。)**

 また双方向通信やGolangについてはまた別でまとめられればと思ってます。
(現状あまりやる気が…)
# 1. 概要
 みなさん、こんな経験ないですか?

### 学校で、授業中寝てる友達に先生が気づくように、音を立てて先生の注目を引いたりして、どうにか友達をチクりたい!

みたいな経験ありませんか?(周りにはないと言わ

元記事を表示

ミニ Abema作ってみたい

# Abemaを作ってみたい
作るならどんな感じになるか考えてみた

# スコープ
Androidのabemaアプリのミニ版(機能 超縮小版)を作成する。
Azure等のサービスを使い、インフラ・バックエンドまで簡単に構築する。

## 実装したいAbemaの機能
時間が限られているため、動画タイプは実装せず、配信型のみ実装する。
配信型で全画面表示時、画面上にコメントが表示されようにするタイプの実装を目指す。(既存abemaにない実装となる)
(niconicoの特許に抵触しないよう気をつけたい、)
コメントを打てるようにする。
ユーザーごとにidを振る。
配信が始まったときに、プッシュ通知を出せるようにする。
画質設定ができるようにする。
ユーザーIDに紐づいたマイリストを作る
リンクでシェアできるようにする
CMを定期的に流せるようにする
埋込み型の広告を表示できるようにする

# やるべきことの洗い出し
プレイストアへの登録(可能な範囲で)
広告表示の方法調査(手続きがめんどくさそうでなので、学習レベルで)
フロントエンドの実装
バックエンドの実装
インフラの構築

## 技

元記事を表示

【Go言語学習】struct{}{}

## struct{}{}
再度、なんだこりゃと思い

以前、関数の引数の定義において c <-chan struct{} という表現を知った時、メモリを消費しない表現であると認識したが、受信専用で有ったためか struct{}{} は出てこなかったようで... マップや送信専用チャネルの変数に入れる際は c chan<- struct{}{} とするようで、 意味としては struct{}型の空のインスタンス(値が何も無いので、値を管理するためのメモリを消費しない) を表現しているとのこと。 ・インスタンス自体は存在するためnilではない ・配列のノリで struct{}{}{} をやると、文法エラー ・interface{}{}も文法エラー ## mapで試す ```Go package main import "fmt" func main() { set := make(map[string]interface{}) // 要素を追加 set["item1"] = struct{}{} set["item2"] = "" set["item3"] = nil

元記事を表示

【Golang】Goroutineについて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/f22aafef-3524-8098-0d36-551dc0f21a01.png)

## Goroutine

とても簡単に言うと、`Goroutine (ゴルーチン)`とは、Go言語で**並列処理**を簡単に実現するためのものです。

参考)

https://go.dev/doc/effective_go#goroutines

**並列処理**を適切に実装することで実行効率が良くなります。

具体的には、複数のCPUを利用してタスクを分散することで、全体の処理速度を高めることができます。

**3**秒かかる処理`A`と、**2**秒かかる処理`B`の2つを実装してみましょう。

まずは、`Goroutine`を使わずに直列で実装します。

“`golang:main.go
// 3秒かかる処理
func A() {
time.Sleep(3 * time.Second)
println(“A”)
}

/

元記事を表示

Go言語で可変引数の関数にスライスを展開する方法

Go言語において、可変引数の関数を扱う際、スライスを引数として、関数が可変数の引数を受け取る場合に非常に便利です。例えば、ログの出力、数値の集計、文字列の結合など、さまざまなシチュエーションで役立ちます。

### 可変引数の基本

まず、可変引数関数の基本から見ていきましょう。可変引数関数は、任意の数の引数を同じ型で受け取れる関数です。関数定義時には、パラメータの型の前に `…` を置くことで、その型の任意の数の引数を受け取ることを示します。

例:以下の max 関数は、渡された整数の中から最大値を返します。

“`go
func max(values …int) int {
maxVal := values[0]
for _, val := range values[1:] {
if val > maxVal {
maxVal = val
}
}
return maxVal
}
“`

### スライスを可変引数に展開する

次に、あるスライスから条件に合う値のみを選び出し、それを max 関数に渡す例を見てみましょう。たとえば、10以上の値

元記事を表示

JavaのOptionalをgolangにportする – Method Reference と Method values

[JavaのOptionalをgolangにportする](https://qiita.com/shinnara/items/dca2181717e72b92d10d) が他の記事に比べて見られてます。といっても3桁程度ですが。タイトル詐偽的な状況になってしまったのかなと反省してます。今回も大した事は書いてないのでゆるゆるお付き合いください。

# 前回までのあらまし
* Javaを勉強するために、golangでJavaの[Optional](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/Optional.java#L86)を実装してみます
* Optionalをいきなり実装できないので、まず[Function](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/function/Function.java)を実装します
* golangで[

元記事を表示

Go言語でテストごとにデータベースを空にする方法

## はじめに

今回は、ポートフォリオ開発で作成したテストの中で、DBを用いたテストでした工夫を紹介します。

今回作成したコードはGithubにpushしてあるので参考程度にどうぞ

https://github.com/piny940/portfolio

ポートフォリオはこちらから確認できます。

https://www.piny940.com

## 解決策
各テストごとにトランザクションを張り、テストが終わったらロールバックすることで、データベースのデータを空にすることができます。

まず、テスト開始時にテスト用のデータベースに接続をします。

“`go
func TestMain(m *testing.M) {
dsn := fmt.Sprintf(“user=%s password=%s host=%s dbname=%s sslmode=%s”,
os.Getenv(“DB_USER”), os.Getenv(“DB_PASSWORD”), os.Getenv(“DB_HOST”),
os.Getenv(“DB_NAME”), os.Getenv(“DB

元記事を表示

OTHERカテゴリの最新記事