Go関連のことを調べてみた2022年11月24日

Go関連のことを調べてみた2022年11月24日

【Go言語】爆速で変数の命名規則を調整するCLIを作る with cobra!!

# 背景
最近Golangの勉強をしています。業務で若干触るもまだまだ表面的な理解しかできていない気がしており、色々手を動かしてもっと慣れたいと思ったのでCLI Applicationから作ってみようと思いました。

Golang roadmapのここです!
Image from Gyazo

今回開発したレポジトリはこちらです。
https://github.com/ishidao0910/valint

# 準備
開発を進めるための準備をします。

1. goのイニシャライズ
1. cobra cliのインストール

ご自身でレポジトリを用意していただくのがいい気がします。
この先何度か出てきて面倒なので、
– ishidao0910: ご自身のgithubユーザー名
– val

元記事を表示

GOで最初につまづいたこと

# GOのパス設定がよくわからない
GOの勉強を始めようとしたが、つまづいたところがあったのでメモがてらに投稿。
## 問題:GOPATHやGOROOTとか何が何かわからない

### $GOPATH
goのワークスペースのルートディレクトリ
GOPATHの中の構造は以下のようになっている
`src/` : Go ソースコードの場所(例: .go、.c、.g、.s)。
`pkg/` : コンパイルされたパッケージコードの場所(例: .a)。
`bin/` : Go によってビルドされたコンパイル済み実行可能プログラムの場所。

### $GOROOT
異なるGoバージョンを変更する必要がないなら気にしなくていい。

### $PATH
インストールしたパッケージのコマンドなどが記述されたバイナリファイルが格納される場所です。コマンドなどはここから参照してくる。

## 結論
私はgoの開発をする際以下のようなディレクトリ構造で開発することにした。
(合っているかはわからないが…)

### 階層構造
“`
home
├──そのほか
go ← ここがGOPATH
├── src

元記事を表示

Go標準パッケージを利用したリクエスト・レスポンスの処理

# net/http

この記事ではGoの標準パッケージであるnet/httpを利用したリクエスト、レスポンスの処理の方法について解説する。
[「**Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る」**](https://amzn.to/3UI1wa3)という書籍を参考にしており、この書籍のまとめでもある。

# リクエストの受信

## ListenAndServe

GoにおいてHTTPサーバーを起動させるためのメソッド。
第一引数:ネットワークアドレス。「””」を指定した場合、80番ポートになる。
第二引数:リクエストを処理するハンドラ。nilを指定した場合、DefaultServeMuxが使われる。

“`go
server.ListenAndServe(ネットワークアドレス, ハンドラ)
“`

server構造体を使ってサーバーの設定ができる。ネットワークアドレスやハンドラもこの中で指定できるので、これを使った場合引数はいらない。

“`go
type Server struct {
Addr string
Handler Handler

元記事を表示

GoでWebサーバーを作成する2

# はじめに
GolangでAPIサーバーを作るときに調べたことを自分用のメモとしてまとめます。

## 文法関連
* 命名規則
他パッケージからアクセスできるものは先頭大文字にする

[他言語プログラマが最低限、気にすべきGoのネーミングルール](https://zenn.dev/keitakn/articles/go-naming-rules)
[Golangでの命名規則におけるベストプラクティス](https://zenn.dev/kenghaya/articles/1b88417b1fa44d)

* if文

* for文
[Go言語(golang)のループ for, for..range, foreach, while](https://golang.hateblo.jp/entry/2019/10/07/171630#foreach-for–range)

* append関数
スライスに要素を追加する。
配列の長さを指定しないものがスライス。
C#でいうListみたいなもの。
“`cafes = append(cafes, cafe)“`

[【Go】基本文法④

元記事を表示

NeomuttでGmailにOAuth2.0する(2022版)

# NeomuttでGmailにOAuth2.0する(2022版)

## TL;DR

2020年に書いた内容が
古くなったから
更新した

## まえがき

以前、NeomuttでGmailを利用するための手順を書き、Python2の環境では問題なく動きましたが、Pythonの利用環境整えるのが面倒なので、Golangで書き直しました。

## NeomuttでのOAuth2.0利用手順

### Google Cloud PlatformでOAuthクライアントIDを作成する

##### 1. 以下のURLを開き、Google Cloud PlatformのAPIサービス設定を開きます。

https://console.developers.google.com/apis/credentials

##### 2. [新しいプロジェクト]を作成から、mutt用のプロジェクトを作成します。

Google Cloud Platformのロゴの右側あたりの「▷hogehoge▽」の部分を押すと作れました。

![oauth0.png](https://qiit

元記事を表示

【Golang】1 バイトデータの左シフト(ビットローテーション、循環シフト)

> Go 言語(以下 Golang)で、1 バイトのデータを[左シフト](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97#%E7%AE%97%E8%A1%93%E3%82%B7%E3%83%95%E3%83%88)させたのち、右側末尾に[ビット・ローテーション](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97#(%E3%82%AD%E3%83%A3%E3%83%AA%E3%83%BC%E3%81%AA%E3%81%97)%E3%83%AD%E3%83%BC%E3%83%86%E3%83%BC%E3%83%88)させたい。いわゆる、ひとつの[循環シフト](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97#%E8%AB%96%E7%90%86%E3%82%B7%E3%83%95%E3%

元記事を表示

【golang】net/httpのタイムアウト設定

# 概要
先日golangci-lintのバージョンアップを行ったところ、lintの際に下記のような警告が発生しました。
“`bash
cmd/main.go:134:11: G114: Use of net/http serve function that has no support for setting timeouts (gosec)
if err = http.ListenAndServe(“:8080”, mux); err != nil {
“`
調べてみてなるほどと思ったので備忘録として残します。

# 前提
– go version go1.19.3 linux/amd64
– golangci-lint version 1.50.1

# net/httpのタイムアウト

golangの標準ライブラリのnet/httpでは、デフォルトではタイムアウト設定が存在しません。
つまりデフォルトではタイムアウトが発生せず、リクエストの処理終わりを常に待機し続けることになります。

下記はnet/httpライブラリのServer構造体ですが、`Read

元記事を表示

GO言語で並列実行するサンプルコード。ワーカーのキャンセル機能付き

個人的な備忘録として。

“`golang
package main

import (
“context”
“fmt”
“time”

“github.com/pkg/errors”
)

type Result struct {
Task Task
Err error
}

type Task struct {
Bar int
}

func worker(workerID int, ctx context.Context, taskChannel <-chan Task, resultChannel chan<- Result) { // taskCannelがなくなるまで動作する for task := range taskChannel { select { case <-ctx.Done(): // 親からcancel()が実行された場合、動きを止める fmt.Printf("[%d] got Cancel\n", workerID) return default: fmt.Printf("[%d] do task

元記事を表示

Go言語 go versionが出力されない

お疲れ様です。
go言語を始めようとしたところ出落ちしたので、情報共有します。
“`:開発環境
Apple m1 macbook
macOS 13.0.1(22A400)
“`

# 対処法
1\.どこのファイルにPathを追記するか確認
下記コマンドをターミナルで実行
“`
echo $SHELL
“`
・bashなら、~/.bash_profile
・zshなら~/.zprofile
に追記していくことになります。

2\.該当の設定ファイルにパスを追記
“`
$ open ~/.zshrc
または
$ open ~/.bash_profile
“`
openで設定ファイルが開かれるので、pathを追記してください。
自分はzshrcだったので以下のように追記しました。
※ドキュメントにも該当のPATHを追記しろと明記してあります。https://go.dev/doc/install
“`:zshrcの場合
$ export GO_HOME=/usr/local/go
$ export PATH=$PATH:$GO_HOME/bin
“`
ファイルを追記し

元記事を表示

Google Open Source(Go)ではDeprecated(非推奨)なコードがわかりやすく表示される

netパッケージのソースコードを読んでいると、ファイル内で使われている[syscallパッケージの記述に打ち消し線が引かれていた](https://cs.opensource.google/go/go/+/refs/tags/go1.19.3:src/net/dial.go;l=609;bpv=0;bpt=1)。

![スクリーンショット 2022-11-19 15.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/0ab12f7b-1ac2-b249-e11f-56e0bc4d080f.png)

他にも、この画像でいうと`Cancel`にも打ち消し線が引かれている。
まあ、なんとなくどういうときに打ち消し線が引かれるのか予想はできるが、軽く調べてみた。

どういうときに打ち消し線が引かれるかというと、そのパッケージやメソッド、型や変数が**deprecated**(非推奨)のとき。

Goでは、`Deprecated:`という修飾を含んだコメントを記述することで、対象

元記事を表示

Tree Maker_Convert Markdown to tree!_WebAssembly&ServiceWorker

https://ddddddo.github.io/gtree/

![web_example.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271313/83d52823-8f74-d5f8-14c3-4110f54110d6.gif)

# これは何か?
Markdown形式の入力を与えると、treeコマンド結果のような表示がされるWeb appです。
以下の4種類の記号が使えます。
`*`, `-`, `+`, `#`

また、出力されるツリーの各階層は、入力となるMarkdownでは半角スペース2つずつインデントすることで表現します。

# このサイトの特徴は?
– Markdownからtreeを生成する処理はGoで書いており、その処理部分はTinyGoでWebAssembly(.wasm)としてコンパイルしています。
– コンパイルされたバイナリはJavaScriptから呼ばれます。
– ServiceWorkerを利用していて、このWeb appを構成する静的コンテンツ(.wasm含む)は

元記事を表示

Leetcode 263. Ugly Number

# 263. Ugly Number
https://leetcode.com/problems/ugly-number/description/

# 難易度
– EASY

# アプローチ
– Bruthforce

## Java
“`java
class Solution {
public boolean isUgly(int n) {
if (n == 0) {
return false;
}
if (2 <= n && n <= 6) { return true; } while (true) { if (n % 2 == 0) { n /= 2; continue; } if (n % 3 == 0) { n /= 3; co

元記事を表示

Go標準パッケージを利用したJsonデータの読み込み&出力

## 概要

JSONの読み込みは「json.Unmarshal」「json.NewDecoder」の2種類、JSONの生成は「json.Marshal」「json.Marshalindent」「json.NewDecoder」の3種類を使った方法を紹介する。

## encoding/jsonパッケージ

JSONデータのエンコードとデコードをするためのパッケージ。
今回はこのパッケージを使用してJSONデータの解析を行う。

## JSONデータの読み込み

### json.Unmarshal

`json.Unmarshal()`はJSONを構造体に変換する。
第一引数にJSON形式のデータを、第二引数にポインタを指定することでJSON形式で受け取った値を指定したポインタに保存することができる。
“`go
json.Unmarshal(JSON形式のデータ, ポインタ)
“`

### JSONデータを解析してみる

今回は以下のようなJSONデータを用意する。ファイルの名前はtest.jsonとする。

“`json
{
“id” : 1,
“content”

元記事を表示

go のわかりにくい型推論

# これは何?

go の型推論が思いがけない動作をしたのでその記録。

# 普通の例

“`go:go1.19
func main() {
f := func(i int) uint8 {
return uint8((1 << i) % 10) } fmt.Println("f(5) =", f(5)) //=> f(5) = 2
}
“`

$2^n$ を 10で割った余りを `uint8` で返すという普通の関数。

2の5乗 は 32 なので、 `f(5)` は 2 になる。順当。

# 思いがけなかった例

上記の関数 `f` に 10 を入れると

“`go:go1.19
fmt.Println(“f(10) =”, f(10)) //=> f(10) = 0
“`

$2^{10}$ は 1024 なので `f(10) = 4` となるかと思いきや、ゼロになる。

私は意外だった。

# いろいろ試した

## 一回変数で受ける

“`go:go1.19
f := func(i int) uint8 {
n := 1 << i return ui

元記事を表示

Goのdatabase/sqlを利用してPostgreSQL/MySQLへ接続&CRUD操作してみた

[「**Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る」**](https://amzn.to/3UI1wa3)という書籍を参考に、database/sqlを利用したデータベースへの接続とCRUD操作についてまとめました。

# PostgreSQLへの接続

### ドライバーのインストール

ドライバーをインストールする必要がある。

“`bash
go get “github.com/lib/pq”
“`

### 接続方法

“`bash
sql.Open(“postgres”, “user=ユーザー名 dbname=DB名 password=パスワード sslmode=disable”)
“`

# MySQLへの接続方法

### ドライバーのインストール

こちらも同様にドライバーをインストールする必要がある。

“`bash
go get -u github.com/go-sql-driver/mysql
“`

### 接続方法

“`sql
sql.Open(“mysql”, “ユーザー名:パスワード@tcp(ホスト:ポート番号

元記事を表示

「Go×Firebase×React」でJWT認証できる簡単なTODOアプリ作ってみた

こんにちは。初投稿です。
来年から新卒でエンジニアになる予定の者です。

## 初めに
実務未経験、独学ですので、何か勘違いがあるかもしれないということを予めご了承ください。間違いがあれば指摘していただけますと幸いです。

またこの記事ではDockerやReactなどの詳しいことは触れていません。

## この記事でやること
Go,Reactを学習したので習作物としてバックエンドGo,フロントエンドReactを使ったFirebase×JWT認証つきの簡単なTODOアプリを開発しました。

簡単にJWT(Json Web Token)だけ説明しますと、
* 認証用のトークンとして用いられる
* JSON形式でやり取りするため任意の情報を含むことができる
* 改ざんを検知できる
などの特徴があります

https://jwt.io/

こちらの記事がハンズオン形式でわかりやすかったです。↓

https://qiita.com/po3rin/items/740445d21487dfcb5d9f

# 完成イメージ
![TODO操作デモ.gif](https://qiita-image-st

元記事を表示

[OCI]Autonomous Database:Goで書かれたアプリケーションからAutonomous Databaseに接続してみた時のメモ

# はじめに
OSがOracle Linux 7.9のComputeインスタンスに、Go言語とOracle Instant Client、Go DRiver for ORacle(godror)をインストールしてAutonomous Databaseに接続してみた時のメモです。

# 1. GoとOracle Instant Clientのインストール

“`
sudo yum install -y oracle-instantclient-release-el7 oracle-golang-release-el7
sudo yum install -y git gcc golang
sudo yum install -y oracle-instantclient-sqlplus
“`
# 2. godrorのインストール

“`
go mod init github.com/godror
go get github.com/godror/godror@latest
“`

# 3. tnsnames.oraの作成

“`
mkdir /home/opc/tns
vi /ho

元記事を表示

Go Package 命名法

# Go Packageの命名方法

公式[GoのBlog Pacakge names](https://go.dev/blog/package-names?utm_source=dlvr.it&utm_medium=twitter)の(一部)和訳、まとめになります。

## 導入
いいパッケージの名前はパッケージの内容を示唆し、そのユーザーが内容や使い方を理解するのに役立つ。[Effective Go](https://go.dev/doc/effective_go#names)にパッケージ、タイプ、関数など名前の付け方のガイドラインがあり、それらをさらに拡張して議論します。悪い名前の付け方、その直し方も議論します。

## パッケージの命名

### いいパッケージの名前は短くて簡単なもの
Lower case (小文字) のみ
under_scores, mixedCaps がないもの

いい例
– time
– list
– http

悪い例
– computeServiceClient
mixedCapsは使うべきではない
– priority_queue
under_s

元記事を表示

GORMでUNIONを使用する際の注意点

# GORMでUNION?

GORMには、UNIONはサポートされていないので、Rawを使用する。
“`
db.Raw(“? UNION ?”,
db.Select(“*”).Model(&Foo{}),
db.Select(“*”).Model(&Bar{}),
).Scan(&union)
“`
https://stackoverflow.com/questions/67190972/how-to-use-mysql-union-all-on-gorm

# 問題

GORMでUNIONしようとした際に、
“`
db.Raw(“? UNION ?”,
db.Select(“*”).Model(&Foo{}).Order(“aaa”),
db.Select(“*”).Model(&Bar{}).Order(“aaa”),
).Scan(&union)
“`

“`
Error Code: 1054. Unknown column ‘aaa’ in ‘order clause’
“`
が発生。
aaaカラムは、ちゃんとあるのに。。。

#

元記事を表示

[Go] 定番(?)のじゃんけんゲームを作ってみた

# Go言語を使ってじゃんけんゲームを作ってみた!

## 目的 : Go言語の基本文法を確認

::: note info
INFORMATION

### インポートするライブラリ
+ __fmt__ : ターミナルへの出力用フォーマットライブラリ
+ __math/rand__ : ランダム値の生成
+ __strconv.Atoi__ : ターミナルからのstring入力(Ascii)をint typeに変換
+ __time__ : ランダム値の生成時に利用

### 環境
+ __macOSX__ : Montrey 12.6.1
+ __Goland__ : go1.19.3 darwin/amd64
+ __Visual Studio Code__ : 1.73.1

### 利用した文法
+ if 〜 else if 〜 else 文
+ ランダム値の生成
+ ポインタによる、値の更新
+ mapを使った連想配列(Pythonの辞書相当)
+ スライス機能

### ゲームの内容
+ コンピュータの手は、ランダム値から生成&決定
+ 5回実行して、結果を「○勝 ○敗

元記事を表示

OTHERカテゴリの最新記事