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

Go関連のことを調べてみた2021年09月11日
目次

【Go】シングルクォーテーションとダブルクォーテーションの型

シングルクォーテーションはrune型、ダブルクォーテーションはstring型で違う型になる

“`go
package main

import “fmt”

func main() {
fmt.Print(‘A’ == “A”) // invalid operation: ‘A’ == “A” (mismatched types untyped rune and untyped string)
}
“`

シングルクォーテーションはint32型でUnicodeの値をとる

“`go
package main

import “fmt”

func main() {
s := ‘A’
d := “A”
fmt.Printf(“%v %T %v %T”, s, s, d, d) // 65 int32 A string
}
“`

元記事を表示

【Golang】構造体の並び順を自動で整える(govet の fieldalignment エラーの自動修正)

## Struct構造体Field Alignmentフィールドの並び で叱られる

> Go 言語の総合 lint ツールの [golangci-lint](https://golangci-lint.run/) で、`govet` の linter が「構造体の並び順にメモリの無駄がある」と指摘してきます。
>
> “`go:ほらgolang叱られた
> fieldalignment: struct with N pointer bytes could be M (govet)
> “`

この、`govet` の `fieldalignment` エラーが出るたび、構造体のフィールドの並びをコピペピピックするトライ&エラーでわけわかめになるのが面倒なのです。[「”go” golang fieldalignment govet フィールド 並び順 修正」でググって](https://www.google.com/search?q=%22go%

元記事を表示

GOPATHとGOROOTになにを指定したらいいの?

###GOPATH
ホーム直下に「go」という名前のディレクトリを作成し、それを指定する。
調べてみたところ指すところはなんでもよいみたい。しかし、GOPATHと被らないように注意する。
「go」のようなディレクトリをホーム直下に置く人が多いみたいだ。
#####僕の指定例
`GOPATH` : `C:\Users\<ユーザ名>\go`

###GOROOT
インストールしたときに指定したgoディレクトリを指す。
#####僕の指定例
`GOPATH` : `C:\Program Files\Go` ←これは僕がGoをインストールしたときの参照先

###なぜこのような記事を?
goをインストールしてすぐ、環境構築を進めていたところ思うように進まなかった。
`GOPATH set to GOROOT (C:~~~~~~~~) has no effect`というエラー文が出た。

#####原因
1 `GOPATH`と`GOROOT`の指す先が同じであった。
2 `GOROOT`をインストールディレクトリにせず全く関係のないディレクトリにしていた。
とくにインストール後これらをいじった

元記事を表示

Go で、デバッガの attach まで実行を待機させる

Node.js や Java (JVM) 等はランタイムが大きいこともあり、本体側にデバッギ支援の機能を持っている。

`node –inspect` か、 `NODE_OPTIONS=”–inspect” ~` で、Node.js 側がポートを開いてデバッガの接続を待ち、 `–inspect` であれば、接続後にすぐ実行を開始する。 `–inspect-brk` であれば、接続後に即 break する。

一方で、Golang などのネイティブバイナリへコンパイル&リンクをする言語では、実行バイナリ本体にデバッギ支援の機能を持たせるような富豪なことはできない。別途、dlv(1) がデバッガである。よって、以下のいずれかでデバッガを動かしてやる必要がある。

* dlv 下でコマンドを実行する
* 既存プロセスへ dlv が attach する

その上で、dlv が開くポートへインターフェイス(IDE 等)で接続する。前者ができる環境があるならば、話は簡単だ。だが、後者のようなケースも多い。思いついたオプションや引数を指定してコマンドラインから実行したいとか、他のツールの配下

元記事を表示

`go install` で、コマンドのパッケージパスとバージョンを保持しておきたい

どうも。昨日初冠雪した富士山を眺めつつ記事を書いている、アユタヤドットコムの那賀です。

go 1.16 から、グローバルへのツールのインストールには `go install` を使い、開発中のライブラリの管理には `go get` を使うということで、きっちり分かりやすくなりました(参考: [Go1.16からの go get と go install について – Qiita](https://qiita.com/eihigh/items/9fe52804610a8c4b7e41) )

しかしこの `go install` は、 `$GOPATH/bin` にパッケージ末尾の名前でコロンと実行ファイルを転げてくれるだけというとても思い切りの良い仕様なので、いくつかの情報が落ちます。 // [go command – cmd/go – pkg.go.dev](https://pkg.go.dev/cmd/go#hdr-Compile_and_install_packages_and_dependencies)

具体的には、以下がやや辛い。特に、今入っているコマンドが最新なのかを確認

元記事を表示

Goの実行時にimportエラーでハマった話。

## はじめに
Goの勉強中、実行するとimportエラーでハマったのでその時に調べた内容を記録しました。

## エラー内容
ターミナルでmain.goファイルのある階層まで移動し、以下のコマンドで実行する。

“`
$ go run main.go
“`
すると、以下のエラーが表示された。

“`
main.go:5:2: package my_app/config is not in GOROOT (/usr/local/Cellar/go/1.16.5/libexec/src/my_app/config)
“`

## エラーが発生したときの状況
main.goファイルにconfigディレクトリ内のconfig.coファイルをimportしようとしたところでエラーが発生。

“`main.go
package main
import (
“fmt”
“my_app/config” //←ここの読み込みができずエラーが発生
)
func main() {

“`
main.goファイルと、configディレクトリの位置関係

“`Go
$GOPA

元記事を表示

A tour of goで”no required module provides package golang.org/x/tour/”が出て困った

めっちゃ初歩的で恥ずかしいんですが、めっちゃ詰まってました笑

## バージョン

“`zsh
go version
go version go1.17 darwin/arm64
“`

## 事象

以下のように、`golang.org/x/tour/`の下のパッケージを`import`するようなファイルが実行できない。

https://go-tour-jp.appspot.com/moretypes/18

`go run ./exercise-images.go`で実行したときのエラーは以下。
exercise-images.go:7:5: no required module provides package golang.org/x/tour/pic: go.mod file not found in current directory or any parent directory; see ‘go help modules’

## 解決

モジュール化したいルートディレクトリに遷移して以下コマンドを実行します。

“`zsh
go mod init <モジュー

元記事を表示

[Go] Singletonパターン -Goで学ぶデザインパターン-

#Singletonパターンとは
###一言で言うと
インスタンスが1個しか存在しないことを保証するパターンのこと

###どういうときに使うのか
次の条件を満たす
– 状態を持たないこと
– ポリモーフィズムが絡む (抽象クラスまたはインタフェースを実装している) こと

「このクラスのインスタンスはたった一つしか作らないし、作りたくない」というときに使う。

#Goで実装してみる

“`go:config.go
package config

import “sync”

type Config interface {
PutString(key string, value string)
GetString(key string) (string, bool)
}

type config struct {
stringValue map[string]string
}

func newConfig() *config {
ret := new(config)
ret.stringValue = make(map[string]string)
return re

元記事を表示

【Go】xormの使い方 その②

# はじめに
前回に続いて、xorm使い方その②です。
前回の続きですので、xormの導入などは終わっている程で話を進めます。
今回はいろんなメソッドを解説しようと思います。
今回解説するのは、以下の通りです。

# 目次

– Table
– Select
– Sum, SumInt
– Where, And, Or
– OrderBy, Asc, Desc
– SQL, Query

# 環境

go 1.15
github.com/go-sql-driver/mysql v1.6.0
xorm.io/xorm v1.2.3

# DBのデータ

今回はこちらのデータを使用します。
![スクリーンショット 2021-09-05 23.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986475/0b372c59-e6d4-3766-5d0e-e951fe604a68.png)

# enginの用意

“`go
package main

import (
“fmt”
“log”

元記事を表示

【Go】xormの使い方 その①(CRUD)

# はじめに

業務でxormを使ったのですが、参考にする記事が少なかった印象なので、
初学者への参考になればと記事にしてみました。
今回は基本的なCRUDのみです。

xormとは
Go言語で使えるORMです。
Go 1.6以降で利用可能です。

# 環境

go 1.15
github.com/go-sql-driver/mysql v1.6.0
xorm.io/xorm v1.2.3

# xormで出来ること

DBのテーブルと、Goの構造体のマッピングが出来ます。

このテーブルと
![スクリーンショット 2021-08-29 20.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986475/08b732d7-3fc7-4f8d-2e79-362fbf7bb8a5.png)
この構造体

“`go
type User struct {
Id int64
Name string
Age int
Password string `xorm:

元記事を表示

【備忘】Go 言語のデータ型と型変換

備忘として、Go 言語の「データ型」と「型変換(キャスト)」についてまとめておきます。

# 1.Go 言語データ型一覧

|データ型|サイズ|説明|値の範囲|
|—|—|—|—|
|uint8|1byte|符号無し整数|0 ~ 255|
|uint16|2byte|符号無し整数|0 ~ 65535|
|uint32|4byte|符号無し整数|0 ~ 4294967295|
|uint64|8byte|符号無し整数|0 ~ 18446744073709551615|
|int8|1byte|符号付き整数|-128 ~ 127|
|int16|2byte|符号付き整数|-32768 ~ 32767|
|int32|4byte|符号付き整数|-2147483648 ~ 2147483647|
|int64|8byte|符号付き整数|-9223372036854775808 ~ 9223372036854775807|
|float32|4byte|単精度浮動小数点数|有効桁数6桁の実数|
|float64|8byte|倍精度浮動小数点数|有効桁数14桁の実数|
|compl

元記事を表示

Golang の構造体の初期値をnil にしたいときはポインタ型でフィールド変数で定義する

# Golangの初期値
Golangはプリミティブ型にそれぞれ初期値を持っている。
string型 なら`””`
int型 なら`0`

など、ゼロ値という名前でそれぞれのプリミティブ型を定義した時になんの値が入っているかが既に決まっている。

しかし、フィールド変数の型をユーザ定義型にしている構造体を扱う場合、単純に構造体のインスタンスを生成してしまうと、ユーザ定義型を遡ってプリミティブ型のゼロ値を代入された構造体が生成され、特定のフィールドだけnil にすることができません。

こうしてしまうと、他のAPIからjson を読み込みたい時などに全てのフィールドに空文字が入ってしまったり、0 が入ってしまったりしてしまうため、あまり良いとは言えません。

# 解決策
フィールド定義を行う時にユーザ定義型のポインタ型にしましょう。
ポインタ型のゼロ値はnil なので、代入されていないフィールドが自動的にnil になって返却されます。

# 参考元
https://pon3-blog.com/?p=137

元記事を表示

Express React Ruby Go

Express React Ruby Go

Node.js

“`
su –
yum install -y https://rpm.nodesource.com/pub_12.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm
yum install -y nodejs
node -v
“`

元記事を表示

Azure SDK for Goの管理ライブラリーセットがリニューアル

Microsoft AzureをGoでプログラミングして管理/制御する「[Azure/azure-sdk-for-go: Microsoft Azure SDK for Go](https://github.com/Azure/azure-sdk-for-go)」の管理ライブラリーセットが、v56.0.0から通称「Track 2」と呼ばれていた Azure SDK デザイン ガイド に準拠したものになりました。

– [Go Guidelines: Introduction | Azure SDKs](https://azure.github.io/azure-sdk/golang_introduction.html)

新セットのパッケージは `sdk/` ディレクトリーに置かれています。

v55.8.0までの旧セットのパッケージは `services/` ディレクトリーに置かれています。

パブリックプレビューのパッケージは `services/preview/` ディレクトリーに置かれています。メジャーバージョンに昇格するまでは破壊的な変更が入る可能性がありますので、その点に注

元記事を表示

Cloud SQLの自動起動停止

# 概要
Cloud SQLは、インスタンスを継続的に実行するとコストが非常に高い。
そのため、開発環境など24時間稼働する必要のないインスタンスは、必要な時以外インスタンスを停止していくことがベストである。
しかし、「起動停止を毎回しないといけない」+「起動に時間がかかる」で効率が悪い。
したがって、以下のGoogleの公式ブログを参考にCloud SQLの起動停止を自動化してみた。

https://cloud.google.com/blog/ja/topics/developers-practitioners/lower-development-costs-schedule-cloud-sql-instances-start-and-stop

# 全体像
スケジューリングの役割をなすのが、**Cloud Scheduler**
Cloud SQLインスタンスを起動停止させるのが、**Cloud Functions**
Cloud SchedulerからCloud Functionsへの通知の役割をするのが、**Cloud Pub/Sub**

![Screen Shot 20

元記事を表示

A Tour of GoのExerciseをやってみた(Concurrencyの手前まで)

A Tour of GoのExerciseをConcurrencyの手前まで一通りやってみたので、
自分の書いたコードと詰まったポイントなどを補足しながら記事を書いてみました。

同じくGo初学者の参考になれば幸いです!
Concurrencyも後ほど実施予定です。。

## Exercise: Loops and Functions

問題は以下。

https://go-tour-jp.appspot.com/flowcontrol/8

ニュートン法を用いた近似の問題です。
問題文のここが難解ですが、`z -= (z*z – x) / (2*z)`
これは放物線に対して接線を引いて近似をしています。

[ニュートン法のwikipedia](https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E6%B3%95)の図が分かりやすいかと思います。

最初はニュートン法で10回近似するプログラムを書きます。
`for i:=0; i<10; i++` みたいな感じで10回ループを書いてあげ

元記事を表示

Goの開発環境構築(mac)

最近PCを入替えたので備忘を兼ねてメモ

# やりたいこと
1. Go が動かせるようになること
2. バージョンの切替が簡単にできること

# 環境情報
“`
% sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.7
BuildVersion: 19H1323

% zsh –version
zsh 5.7.1 (x86_64-apple-darwin19.0)
“`

# やったこと
1. homebrew のインストール
2. homebrew で goenv をインストール
3. goenv で go をインストール


## 1. homebrew のインストール
公式サイトからインストール用のコマンドを取得してきます。

https://brew.sh/index_ja

取得してきたコマンド

“`
% /bin/bash -c “$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”
“`

元記事を表示

不変(readOnly)が存在しないGo言語で、どうやって構造体の持つ値を不変にするか?

# Go言語には不変(readOnly) を示すことができない
広く知られていることですが、Go言語は指定した変数などを不変にするための機能を持っていません。

プログラムを書く点においては割と重要で、実際にコミュニティでも議論されているようです。
https://github.com/golang/go/issues/32245

では現行のGo言語で不変な構造体を作成するにはどうすればいいのでしょうか?簡単に作成してみました。

# 別パッケージに定義し、外部から参照できないようにする

Go言語では構造体を定義する時に、頭文字を大文字にするか小文字にするかで外部のパッケージからその値が参照できるかどうかを決定します。
そこで、今回の主題である構造体自体を別パッケージに定義し、閉じ込めることで実現してみました。

“`main.go
package main

import “fmt”
import “~/money”

func main() {
Money := money.NewMoney(100, “doll”)
fmt.Println(Money)
}

“`

元記事を表示

【Golang】”go install” でアプリのバージョン情報に自動対応させる【Go 1.16+】

# Go アプリのバージョン表示 in `go install`

:::note warn
この記事は Go 1.16 と 1.17 以上向けです。
:::

> Go 言語(以下 Golang)の俺様アプリで、**アプリのバージョン情報表示に対応**させたい。しかも、`go install` でインストールされてもアプリのバージョン情報が `git tag` に追随するようにしたい。

## TL; DR (今北産業)

1. サンプル
このサンプルは、`git tag` などでバージョンをタグ付けしておけば、アプリを `go install` されてもリポジトリのバージョンに追随します。(`go build` 除く)

“`go:main.go
package main

import (
“flag”
“fmt”
“runtime/debug”
)

var Version string

func main() {
var versionFlag = f

元記事を表示

go で構造体を比較したい時に、気軽に== を使って比較する前に、ポインタ型か、そうでないかをちゃんと確認しようね。

# golang における 「==」 の特性
golang における「==」 は、基本的には対象の同一性をみてtrue/false の判断をする。

ただ、比較する対象がポインタ型でない場合は同値性で判断してくれることもある

例えば
https://play.golang.org/p/E1Fty3pkKYI

“`go
package main

import (
“fmt”
)

func main() {
nameA := FullName{“ヤマダ”, “太郎”}
nameB := FullName{“ヤマダ”, “太郎”}
nameC := FullName{“吉田”, “太郎”}

fmt.Println(nameA == nameB)  // true
fmt.Println(nameA == nameC) // false
}

type FullName struct {
FirstName string
LastName string
}

“`

このように、nameA, B, C にはFullName 型が入っており、その中に入れられたfi

元記事を表示

OTHERカテゴリの最新記事