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

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

printlnとfmt.Printlnの違いが気になったので少し調べた

Goにはbuildinで定義されるprint, println関数がある。

一方でfmtパッケージにもPrint, Println関数がある。

Goを学ぶとサンプルコードではfmt.Printlnで標準出力に出力することが多いが、print, println関数も使える。

この差について気になったので本記事でまとめる。

## 結論

print, printlnは標準エラー出力に、fmt.Print, fmt.Printlnは標準出力に出力される。

## 標準出力と標準エラー出力

標準出力とは、プログラムの出力を表示するために使われるチャネルのことを指す。

コンピュータのシステムやプログラムの情報の”正常”な出力を表示するために使われ、一般的にはディスプレイに表示される。

例えば`ls`コマンドなどはファイルやディレクトリの一覧情報などを標準出力に出力する。

一方で標準エラー出力は、プログラムのエラー情報を表示するために使われるチャネルのことを指す。

例えば`ls`コマンドで存在しないディレクトリを指定するとエラー情報が標準エラー出力に出力される。

どちらも出力先

元記事を表示

go-rodでmoodleの出席登録を自動化

九大では講義時間内にmoodleの講義ページにログインすることで出席登録が行われますが、ユーザ名とパスワードを打ち込む→講義一覧から現在の講義を探す→出席登録という一連の流れが煩雑に感じたのでヘッドレスブラウザで自動化を行いました。
Goを選んだ理由はただ単に触ってみたい言語だったからです。

:::note alert
九大moodleでは出席していないにも関わらずコースにログインして出席とする等の行為は不正出席であり、単位を取り消される場合があります。
自動化プログラムを使用して対面講義の出席登録を行う際は必ず講義に出席し、講義室のedunet(学内LAN)へ接続するようにしてください。
本記事のプログラムを使用したことにより生じたいかなる損害にも筆者は一切責任を負いません。
:::

https://la.kyushu-u.ac.jp/usage-support/attendance/

## 実行環境

– go version go1.22.4 darwin/arm64
– macOS Ventura 13.4

## ディレクトリ構成

“`
auto_attend/

元記事を表示

DynamoDB&Golang Queryまとめ

Queryで使用するdynamodb/api.goに書かれたQueryInputは以下の通りです。

以下に、スペースを全て詰めた表を提供します。

|フィールド名|タイプ|説明|デフォルト値|SQLでの類似概念|
|—|—|—|—|—|
|*ConsistentRead|`*bool`|読み取りの整合性モデルを決定。`true`の場合、強い整合性の読み取りを使用。グローバルセカンダリインデックスではサポートされていない。|`false`|`SELECT` with `FOR UPDATE`|
|ExclusiveStartKey|`map[string]*AttributeValue`|評価を開始する最初のアイテムのプライマリキー。|`nil`|`OFFSET`|
|*ExpressionAttributeNames|`map[string]*string`|式内の属性名の代用トークン。|`nil`|`AS` (エイリアス)|
|*ExpressionAttributeValues|`map[string]*AttributeValue`|式内の属性値の代用トー

元記事を表示

DynamoDB&Golang データ取得/更新/削除/操作まとめ

# PutItem/UpdateItem/DeleteItem/BatchWriteItem/TransactWriteItems

アプリケーションを作成する上で非常によく使用する操作の違いや特徴をまとめてみました。

# 特徴の比較
| 特徴 | GetItem | BatchGetItem | TransactGetItem |
|————————-|————————-|————————-|—————————-|
| **用途** | 単一アイテムの取得 | 複数アイテムの一括取得 | 複数の一貫したアイテム取得 |
| **最大アイテム数** | 1つ | 100個まで | 25個まで

元記事を表示

[VSCode] Goの環境設定。Failed to find the “go” binary in either GOROOT() or PATH(…) を解決する

# 環境
– macOS Sonoma 14.4.1
– Apple M1 Pro
– VSCode:1.90.1
– Go for Visual Studio Code:v0.41.4
– `go1.22.4 darwin/arm64` installed by homebrew
– zsh
#

もともとはJetBraisのGoLandを利用していたんですが、周囲でVSCode派が多く無料で利用できるので乗り換えてみることにしました。
GoのExtensionをインストールしていざ利用と思っていたところ以下のようなエラーダイアログがでて定義ジャンプなどの機能が使えなかったので解消のための設定を記録しておきます
## 遭遇したエラー
“`
Failed to find the “go” binary in either GOROOT() or PATH(…). Check PATH, or Install Go and reload the window. If PATH isn’t what you expected, see https://github.com/

元記事を表示

bufio で string を取ろうとして詰まった話

## RE?
Atcoder で https://atcoder.jp/contests/abc237/tasks/abc237_d を解いていて、
テストケースのうち数ケースのみ RE ( Runtime Error ) になってしまった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817605/735d6903-d2ae-a11b-b4af-f5f74a4ab26f.png)

## 原因
### 自分の実装
bufio の scanner をこんな感じで使っていたのが原因
“`golang
var sc = bufio.NewScanner(os.Stdin)

func main(){
sc.Split(bufio.ScanWords)
s:=scanString()
}

func scanString() (s string) {
sc.Scan()
s = sc.Text()
return
}
“`
### ソースコード

#### 定数

元記事を表示

備忘録 GOの開発環境構築 @VScode

# はじめに
今回自宅用のPCをMacbook airに変更したため、VScodeの環境もはじめから作り直すことにしました。
さらに転職も行うなど、また同じようなことを行わないといけないので、自分用のメモとして本記事を作っておきます。

# VScodeのインストール
下記公式HPから使用環境にあったインストーラーをダウンロード。
[VScodeのダウンロードリンク](https://code.visualstudio.com/)
![](https://storage.googleapis.com/zenn-user-upload/75d765883bfc-20240308.png)

ダウンロード後は、インストーラーを起動し、手順に従ってポチポチする。

# Goのインストール
Homebrewを使ってGoをインストールする(公式HPのインストーラーを使ってもOKだが、せっかくなので今回はHomebrewを利用する。Windowsの場合は公式HPからインストーラーを持ってきてインストールする形になる。)
※Homebrewのインストール方法は下記。
https://zenn.dev

元記事を表示

appendメソッドの初期容量以上の要素を追加したときに起こること

## 実装

“`go
s4 := make([]int, 0, 4)
fmt.Println(s4, len(s4), cap(s4))
s5 := append(s4, 1, 2, 3, 4, 5, 6, 7, 8, 9)
fmt.Println(s5, len(s5), cap(s5))

//[] 0 4
//[1 2 3 4 5 6 7 8 9] 9 10
“`

上記の実装をしたときにs5の容量は初期に設定した以上の要素数を追加しようとしています。そのときにGo言語は、自動的により大きな容量を持つスライスを作成します。今回であれば、最初の1-4までの要素は初期値の容量で入れることができます。しかし、残りの5-9は一度、初期容量の倍の数スライス容量を増やします。それでも足りませんので、Go言語は2のべき条の数容量を追加します。よって、上記の例では倍数容量を追加したときに8となりますが、まだ足りないので、さらに2のべき条ずつ容量を追加します。今回は2だけで足りますので最終的`8+2`で10となります。

よって、次の実装も下記のような結果になります。

`

元記事を表示

GoとRustの文字列周りのデータ型

筆者は普段Goを使って開発していてデータ型に関して馴染があった。

最近はRustを勉強し始めて文字列周りのデータ型について気になったことがあったのでまとめていく。

## Go

Goの文字列にまつわるデータ型は以下の通り。

– string
– byte
– rune

### string

一般的に文字列を扱うためのデータ型。

特に補足はいらないと思うがコードで例を見てみる。

“`go
s := “Hello, World!”
fmt.Println(s)

// “Hello, World!”
“`

ダブルクオーテーションで囲まれた文字列がstring型として扱われる。

### byte

byteはuint8のエイリアスであり、バイトデータを扱うためのデータ型。

コードで例を見てみる。

“`go

b := []byte(“Hello, World!”)
fmt.Println(b)

// [72 101 108 108 111 44 32 87 111 114 108 100 33]
“`

このように文字列をbyte型に変換することでその文字のA

元記事を表示

Goの基本概念だけを学習してみた

# はじめに

Go は近年非常に人気があり、多くの企業や開発者が使用しています。この記事では、Go の基本的な概念について学び、そのメリットを探ります。

# ポインタ

Go ではポインタを使用して変数のアドレスを参照できます。これにより、関数間でデータを効率的に共有することができます。

“`go
package main

import “fmt”

func main() {
x := 5
fmt.Println(“Before:”, x)
increment(&x)
fmt.Println(“After:”, x)
}

func increment(x *int) {
*x = *x + 1
}
“`

このコードでは、increment 関数に x のポインタを渡しています。increment 関数内で x の値を変更すると、main 関数内の x の値も変更されます。

## ポインタのメリット

1. 効率的なデータ共有: 大きなデータを関数に渡す際に、データ全体をコピーするのではなく、ポインタを渡すことで効率的にデータを

元記事を表示

僕なりの Go 備忘録

# GoとGinのDocker環境を作る

“`bash
.
├── Dockerfile
├── docker-compose.yml
└── www
├── app
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   └── views
│   └── index.html
└── html
“`

“`yaml
# docker-compose.yml
version: ‘3’

services:
go:
build:
context: .
dockerfile: Dockerfile
stdin_open: true
tty: true
volumes:
– ./www:/var/www
ports:
– 8080:8080
“`

“`dockerfile
# Dockerfile
FROM golang:1.22.4-bullseye

WORKDIR /var

元記事を表示

DockerでGinのコンテナを立てようとしたらエラーが出た。

# エラー内容

docker composeでコンテナを立てようとしたら
“`
docker compose up –build

[+] Building 0.0s (1/1) FINISHED docker:desktop-linux
=> [server internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 200B 0.0s
failed to solve: dockerfile parse error on line 13: unknown instr

元記事を表示

Ginの環境構築をdockerでやってみた

# はじめに
Goの有名なフレームワークの一つであるGinを触ってみたいと思い、dockerで環境構築してみました。
# Dockerでの環境構築

## 1.Ginのインストール
まず、`Dockerfile`を記述します。

“`Dockerfile
FROM golang:latest

WORKDIR /code
“`

`docker-compose.yml`を記述します。
“`docker-compose.yml
services:
server:
build: .
container_name: gintest
tty: true
volumes:
– .:/code/
ports:
– 8080:8080
“`

一度、`go.mod`を作成するためにイメージを作成します。
“`
docker compose build
“`

ここから一旦コンテナを起動して、go.modを作成します。
“`
docker compose run –rm server sh -c “go mod ini

元記事を表示

Dockerで簡単なGOの環境構築してみた

# はじめに
Goを触りたいと感じることが多くなり、Dockerで簡易的に環境構築してみようと思ったので、やってみました。

# Dockerで環境構築
`Dockerfile`は以下のように記述します。
“`Dockerfile
FROM golang:latest

WORKDIR /app

COPY . .

RUN go mod init myapp
“`

`docker-compose.yml`は以下のように記述します。
“`docker-compose.yml
services:
app:
build: .
container_name: gotest
tty: true
ports:
– 80:8000
volumes:
– .:/app
“`

:::note
tty:trueとつけるとコンテナを永続させることができるので、`docker exec`コマンドが使いたい場合はつけたほうがいいです。
:::

`main.go`にHello Dockerと表示させるスクリプトを書いてみます.
`

元記事を表示

イベントソーシングを知ろう ~ステートソーシングとの比較とGoでの簡単な実装例つき~

イベントソーシングとは、データベースに保存するデータをイベントの形式で保存することです。イベントソーシングを使うことで、データベースの状態をイベントの履歴から再現することができます。

CRUDのようにデータベースの状態を直接変更するのではなく、イベントを発行してデータベースの状態を変更します。イベントソーシングを使うことで、データベースの状態を変更する操作をイベントの履歴として保存することができます。

ステートソーシングとイベントソーシングの違いは、データベースの状態を直接変更するのではなく、イベントを発行してデータベースの状態を変更する点です。イベントソーシングを使うことで、データベースの状態を変更する操作をイベントの履歴として保存することができます。

ステートソーシングにおいて履歴をトレースするためには、データベースの状態を保存するためのテーブルを作成したりロギングを行って時系列で解析する必要があります

この特徴から、イベントソーシングは、データベースの状態を変更する操作をイベントの履歴として保存することができるため特定の時点でのデータベースの状態を再現することが容易で

元記事を表示

【Go】Go1.22で試験導入されたrangefuncを理解したい!

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)
今回は、Go Conference 2024でも取り上げられていた`rangefunc`という新たな機能について自分なりにまとめたので、そちらをご紹介します!

# rangefuncとは?
公式リファレンス参照:https://go.dev/wiki/RangefuncExperiment
> For a future Go release, the Go team is considering adding range-over function iterators. Go 1.22 contains a preliminary implementation of the change, enabled by setting GOEXPERIMENT=rangefunc when building your program. We invite anyone who wants to help us understand the effects of the change to try using

元記事を表示

Goでwebsocketを作ってみた

# どのような実現方法があるのか?
GPTによると…

・Gorilla WebSocket: 高機能で安定しているが、やや複雑。
・nhooyr.io/websocket: シンプルでコンテキスト対応、軽量だが機能は少なめ。
・golang.org/x/net/websocket: 基本的な機能を提供するが、メンテナンス頻度が低い。
・github.com/gobwas/ws: 高速で低レベル制御が可能だが、学習コストが高い。
・github.com/olahol/melody: 使いやすく多機能だが、パフォーマンスやスケーリングの面で劣ることがある。

# プロジェクトの作成
必要なければ飛ばしてください.

詳細を表示

go言語のインストールはこちらから

インストール出来たら.

1. ディレクトリ作成
“`bash
mkdir myproject
“`

2. ディレクトリに移動
“`bash

元記事を表示

インストールしたけどパスが通っていなかった

# 起こったこと

“`bash
go install github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen@latest

oapi-codegen -version
> command not found: oapi-codegen
“`

oapi-codegenを使用してGoのコード自動生成を行おうとしていました。
インストールを実行したはずなのに、コマンドが見つからないようです。

# やったこと

oapi-codegenはgoのバイナリファイルにインストールされるので、Goのパスを確認します。

“`bash
go env GOPATH
> /home/username/go
“`

すでに通っているパスを確認します。

“`bash
echo $PATH
> /usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
“`

この中にさきほど確認したGoのパスがないので、パスを通してやる必要が

元記事を表示

Dockerで簡単なAPIサーバ(Go)を立てる

## 前提
main.goファイル、go.mod , go.sumファイルが同階層にある前提です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/76962e7d-7264-dfb5-b545-9ea037268017.png)

以下を実施した後だとやりやすいです。

https://qiita.com/konnbu/items/76b977f715a13ec3bece

## Dockerfile 作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/2d225c90-d7bb-78f4-3a50-952198dbee13.png)

main.goと同じ階層に作成しています。

“`
# FROM –> DocketHubからpullしてくるベースなるイメージの指定
# WORKDIR –> コンテナ起動後の作業ディレクトリ
# CMD –> C

元記事を表示

Go&echoで簡単にAPI作成

作るものは「最低限必要なものを揃えたmain.go」のみ。
ゴールは「local起動し、ブラウザから確認」&「curlコマンドからAPIを叩けること」です。

## フォルダ構成

めちゃ簡素。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/9b373c54-dc1c-34f2-c4ae-9f0cde3afd5a.png)

つくりかた
1. main.go ファイルを作成
1. `go mod init` を実行、 go.mod, go.sum ファイルが生成される

以上!

## main.go の中身
[こちらの記事](https://zenn.dev/def_yuisato/articles/echo-get-started)を参考にそのまま使わせていただきました。
今回はファイル名だけserver.go → main.goとしています。
ミドルウェアについて、それぞれ
“`
e.Use(middleware.Logger()) // ここからlogが取得

元記事を表示

OTHERカテゴリの最新記事