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

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

Goを使ってみた

Goを使ってみた

最近はやりのGoを触ってみるべくチャレンジ

まずはGoをWindowsマシンにインストール

https://golang.org/dl/ のMicrosoft WindowsからGoをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/4a39a67e-3b30-8c49-4877-1f517ae7e3a0.png)

普通にインストール実施

適当なファイルを作成

“`main.go
package main

import “fmt”

func main() {
fmt.Printf(“hellohogefuga\n”)
}
“`

go run コマンド実行

“`cmd
>go run main.go
hellohogefuga
“`

vscodeで実施

するとこんなエラーが。
“`
go: go.mod file not found in current directory or any parent direc

元記事を表示

【Go言語】外部パッケージをインポートする方法

Go言語初心者なんですが、どうしても外部パッケージをインポートするとき失敗でした。
パッケージが見つからないっていうエラーが出ました。

やっとこの問題が解決しましたので、ここでメモします。

何でもいいですが、サンプルとして、
この記事はBinance APIパッケージをインポートする。

####1. パッケージをインストールする

ターミナルで`go get`実行する

“`
go get github.com/adshao/go-binance/v2
“`

####2. インストールしたパッケージをインポートする

“`go:test.go
import (
“github.com/adshao/go-binance/v2”
)
“`

####3. パッケージが見つからなくて、エラー出ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342464/ebb1c252-ebc0-1f13-f04b-c73536a19ee9.png)

####4. 原因

ター

元記事を表示

hashicorp/logutilsを使ってログレベル指定のないログを非表示にするtips

Go言語のロガー実装の1つに[hashicorp/logutils](https://github.com/hashicorp/logutils)というシンプルなライブラリがあります。Goの標準パッケージ `log` を拡張するようなもので、覚えることも少ないですし、他のライブラリと組み合わせやすい点もメリットです。

利用例は次のようになります。

“`go
package main

import (
“log”
“os”

“github.com/hashicorp/logutils”
)

func main() {
filter := &logutils.LevelFilter{
Levels: []logutils.LogLevel{“DEBUG”, “WARN”, “ERROR”},
MinLevel: logutils.LogLevel(“WARN”),
Writer: os.Stderr,
}
log.SetOutput(filter)

log.Print(“[DEBUG] Debugging”) // 表示されない
log.Print

元記事を表示

Raftで分散データベースを作る – 2ストレージエンジン編

前回の記事では、`etcd`の仕組みについて話しました。
この記事では、ストレージエンジンを実装します。

# ストレージエンジンの決定

元記事を表示

【Golang】ファイル作成→書き込み→読み込み、の一連の流れ

# はじめに

Golangでテスト用に一時ファイルを生成し、中身を書き込み、最後に中身を読み込みたい、となった際にはまったので備忘録として残す

結論からいうと、ファイル読み込み時には、ファイルの先頭から読み込まれるようにすると確実っぽい

# 環境
– go v1.13

# 一時ファイルの作成

“os.Create“でファイル名指定してファイルを作成
一時ファイルなので、“defer os.Remove(f.Name())“で処理完了後にファイル削除するようにする

※Goバージョン1.16以降だと“os.CreateTemp“という一時ファイル生成用メソッドが用意されているっぽい
が、こちらの場合でも明示的に削除する処理は記載必要とのこと(何のためのTempメソッドなのだろうか…)

参考:https://pkg.go.dev/os#CreateTemp

“`golang
f, err := os.Create(“example.csv”)
if err != nil {
panic(err)
}
defer os.Remove(f.Name())
“`

元記事を表示

Goの構造体に連想配列を入れる。(可変長)

以下のような構造のJsonを生成したかったのだけど、
自分にはあまりいい記事がなかったので書くことに。
Responseキーの中のリストは、可変します。

“`bash
{
“header”: {
“error_message”: “”,
“status”: “222”
},
“Response”: [
{
“code”: “111”,
“name”: “1”
},
{
“code”: “111”,
“name”: “2”
},
{
“code”: “111”,
“name”: “3”
}
]
}
“`

“`bash
{
“header”: {
“error_message”: “”,
“status”: “222”
},
“Response”: null
}
“`

### とりあえずコードです

“`struct.go
package main

import (
“encoding/js

元記事を表示

grpcurlで快適gRPC通信テスト

# 経緯

goで作っているサービスのgRPC通信の動作確認用に`grpcurl`というクライアントツールを使ってみました。

別クライアントの`grpc_cli`はMacローカルにbrewでインストールしてもうまくパスが通らず諦めました。

### 環境
“`bash
$ sw_vers
ProductName: macOS
ProductVersion: 11.5.1
BuildVersion: 20G80
$ go version
go version go1.16.6 darwin/arm64
$grpcurl –version
grpcurl 1.8.2
“`

インストールはおもむろに `brew install grpcurl` で行いました。

#手順

### 1. サーバーを立ち上げる

“`bash
$ cd $GOPATH/src/github.com/hoge-monorepo
$ go run cmd/xxxx/main.go
{“level”:”INFO”,”ts”:”2021-08-16T16:33:21.649229+09:00″,”calle

元記事を表示

GolangでgRPCに入門

golangでGRPCを使ったプロトタイプを作る手順です。

https://qiita.com/marnie_ms4/items/4582a1a0db363fe246f3#grpc%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

を記事を多いに参考にしてます。
この記事のコードは上記の記事と同一です。どこにコードを書くかと、`protoc`コマンドについて多少明確になっています。

Goのバージョン管理には`gvm`を使っています。
Goのバージョンは `go version go1.16.5 darwin/amd64` です。

`protoc`コマンドを使うので以下でinstallしてください。

http://google.github.io/proto-lens/installing-protoc.html

# プロジェクトの用意

適当なプロジェクトをこしらえます。

“`
go mod init example.com/cat
“`

必要なパッケージを入れます。

“`
go get

元記事を表示

Go言語でOS環境変数を取得する

Goではユーザ名とかパスワードなどの設定は環境変数に持たせるのが一般的らしい。

じゃあどうやって取得すれば良いのか?
`os.Getenv(”キー名”)`で取得できます

以下サンプル

### 環境変数の作成
サンプルとして`.env`ファイルをつくります。

“`bash
export Test=test_dayo
export TEST=oomoji_dayo
“`

### 環境変数の登録
sourceコマンドで読み込みます(環境変数へ登録)

“`bash
$ source .env
$ env | grep TEST
TEST=oomoji_dayo
$ env | grep Test
Test=test_dayo
“`
ちゃんと入ってますね。

### Goを書く。

main.goを書きます。

“`go
package main

import (
“fmt”
“os”
)

func main() {
fmt.Println(“test”)

Test := os.Getenv(“Test”)
TEST := os.Getenv(“TEST”)

元記事を表示

GoのEven Or Oddの問題から解決方法の豊富さ

[Go](https://golang.org/)の勉強がてら問題をといており、解き方が複数あり個人的なポエム。

bit wise and が結構優秀だったので、覚書。

## 課題

“`
引数number(int)を渡すEvenOrOdd関数を作成して、引数が偶数の場合は”Even”、奇数の場合は”Odd”を返却する関数を作成しなさい。
“`

### 解決方法1. あまりを計算してstringを返却する

“`main.go
package main

func EvenOrOdd(number int) string {
if result := number % 2; result == 0 {
return “Even”
}
return “Odd”
}

“`

### 解決方法2. 連想配列を作成して、計算結果をkeyにしてvalueを返す

“`main.go
package main

import “math”

func EvenOrOdd(number int) string {
dict := map[i

元記事を表示

Goroutineはどうやって動作するのか

## 入る前に
[Gophercon](https://youtu.be/YHRO5WQGh0k)の動画をYoutubeで見れる機会がありました。 その中に、Goroutineについて色々情報があり、今回すごく勉強になったと思いまして、皆さんに共有したくてこの記事を作成するコヨになりました。
もし、間違ってる情報や、勘違いがあれば、コメントしていただければ更に勉強になると思います。

## Intro
Golangの特徴としていつも挙げられるのは、強力な同時性サポートです。
この強力な同時性に欠かせない要素は `goroutine` です。 開発者は、`go` キーワードをつかって`goroutine` を生成することで簡単に同時性をサポートするプログラムを開発できます。 `Channel` を使えば、`goroutine` 間でデータを簡単に伝えることもできます。

“`go
package main

import (
“fmt”
“time”
)

func main() {
go f()

fmt.Println(“hello world

元記事を表示

【Go】gormの「Unknown column ‘…’ in ‘where clause’」エラーの解決方法

## 背景
idをprimary keyとして持つusersテーブルに対して、idで検索するgormの構文を書きました。

“`go
db.First(&user, id)
“`

すると「Unknown column ‘‘ in ‘where clause’」というidの値の名前のカラムがありませんというエラーが発生してしまいました。

## 解決方法
[gormの公式ドキュメント](https://gorm.io/docs/query.html#Retrieving-objects-with-primary-key)を読むと以下のように書かれていました。

> If the primary key is a string (for example, like a uuid), the query will be written as follows:

“`go
db.First(&user, “id = ?”, “1b74413f-f3b8-409f-ac47-e8c062e3472a”)
“`

primary keyがstring型の場合は`”id =

元記事を表示

VSCodeでGoを書くときは作業中のディレクトリを開かないとエラーが発生する

Goでの開発中、以下のようなエラーが発生した

“`
gopls requires a module at the root of your workspace.
You can work with multiple modules by opening each one as a workspace folder.
Improvements to this workflow will be coming soon, and you can learn more here:
https://github.com/golang/tools/blob/master/gopls/doc/workspace.md.
“`

![スクリーンショット 2021-08-13 23.16.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349049/c7894bc3-02ef-ec92-e0db-1b20276e8e5c.png)

ワークスペース上にモジュールが必要?最初はVSCodeのワークスペースのことか

元記事を表示

Go 学んだことその1

#Golang 初心者の学んだことまとめ

あたらしく学んだことをメモ程度に書いていこーと思います。(随時更新)
教材はudemyの
####package達
  – time
  - regex
  - sort
  - ioutil

###time
利用するpackageはtime

“`golang
func main() {
t:=time.Now() //現在時刻get
fmt.Println(t)
fmt.Println(t.Format(time.RFC3339),t.Year(),t.Minute())
//RFC3339というフォーマットが一般的らしい…
//〇〇分後の時刻を表示
f2:=t.time.Add(1*time.Hour) //現在時刻(t)の1時間後の時間を表示
//〇〇分前の時刻を表示
f3:=t.time.Add(-5*time.Minute) //現在時刻の5分前を表示
}
“`

###regex
利用するpackageはregexp
日本語で言う

元記事を表示

macでa tour of goをローカルで実行したときに詰まった

ひょんなことからgoを書くことになり、
[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)を実行しようとしてうまく行かなかったので記事に残します。

## 前提

– macOS (Big Sur)
– Homebrewインストール済み

## goのインストール

“`zsh
$ brew install go
$ go version
“`
これでバージョンが返って来ればOKです。自分は以下バージョンでした。
`go version go1.16.6 darwin/arm64`

> ローカルで Go Tour を実行するためには、はじめに、 Goのダウンロードとインストール し、コマンドラインで以下のように実行します:

“`zsh
$ go tool tour
go tool: no such tool “tour”
“`

はて・・・?
おそるおそる[英語版](https://tour.golang.org/welcome/3)を見てみるとコマンドが違う!?

“`zsh
go install golan

元記事を表示

Golangで構造体に構造体を入れて、複雑なJsonを出力する

変数名とか適当です。

Kouzou_oyaの中にはKouzou_kobunというキーがあり、
変数の型がKouzou1という構造体になってる感じです。(事前にこういう定義をしないと行けないのがGo言語特有な気がします)

“`main.go
package main

import (
“encoding/json”
“fmt”
)

type Kouzou1 struct {
Var1 string
Var2 int
}

type Kouzou_oya struct {
Status string
Message string
Kouzou_kobun Kouzou1
}

func main() {
// resultに構造体と値をセット
result := Kouzou_oya{
Status: “22222”,
Message: “構造体テスト”,
Kouzou_kobun: Kouzou1{
Var1: “aaaa”,
Var2: 2,
},
}

//fmt.Println(result)

元記事を表示

Go言語:foo(s []int)とfoo(s *[]int)本質的な違い

###背景###
業務上でgolangを使っています。スライスは関数の引数として使う場合は、ポインタを使うべきかどうかを説明いたします。

“`go
func foo(arr *[]int) { <- スライスのポインタを使う場合 *** } func bar(arr []int) { <- スライスのポインタを使わない場合 *** } ``` ###結論### ***結論 1. 関数内からスライスが参照するArrayの要素だけ変更したい場合は、スライスのポインタを使う必要がありません*** ***結論 2. 関数内から外側のスライスの変更(start,len,cap)スライスのポインタを使うべきです*** ***結論 3. 関数内の変更がスライスが参照するArrayを作り直された場合、スライスポインタを使うべきです*** ###説明### ####結論1. 関数内からスライスの要素だけを変更したい場合は、ポインタを使う必要がありません。 #### ```golang package main import "fmt" func main() {

元記事を表示

gRPC チュートリアル 入門 ver.IntelliJ GoLand

Go言語を学び始めて、gRPCに興味が出ましたのでとりあえずチュートリアル的なことをしようとしたのですが、設定やらコマンドの書き方に結構苦労しましたのでメモ代わりに記録。
また、今回メモする内容はこちらのサイト「[gRPC チュートリアルで入門しようぜ!](https://nekonenene.hatenablog.com/entry/grpc-first-tutorial)」の内容を自身の環境に合わせた際にどういった設定をするのかなどを記載していますので、詳しい説明は本家のサイトを参照してください。

#gRPCとは?
今回は理解するというよりも、触ってみようということも目的としていますので、詳しい説明は他の方々がわかりやすく説明してくださっていますので割愛させていただきます。
概要だけ少し書きますと、gRPC(ジーアールピーシー)はGoogleが2015年に開発したオープンソースのRPCです。RPC(Remote Procedure Call/遠隔手続き呼び出し)とは、ネットワーク上の他端末と通信するための仕組みのことで、これによって他端末のプログラムをリモートで実行することができ

元記事を表示

go で「*」をたくさんつけるとコンパイルに30時間以上かかることがある

# これは何?
先日

https://qiita.com/Nabetani/items/3ddd37cf987102640c57

という記事を書いたんだけど、そういえば go もたくさん `*` をつけられそうだなと思って試した。

# `*` の付け方

こんな感じ。

“`go:go
package main

import (
“log”
“unsafe”
)

func main() {
var p ********************************uintptr
x := (uintptr)((unsafe.Pointer)(&p))
*(*uintptr)((unsafe.Pointer)(&p)) = x
log.Println(********************************p)
}
“`

x の初期化と `*****(略)*****p` の間に GC が入ると死ぬような気がするけど気にしない。

実行するとこんな出力が得られる。

“`text
2021/08/10 18:33:55 824634449

元記事を表示

AWS ChatbotでSlackからLambda関数(Go)を呼び出す 

## はじめに
CICDの一環でGoのLambdaをSlackから呼び出す仕組みを構築したのでその備忘録を残す。
(Goは初見だったので少しGoを触った所も書き残した。)

## Goを使ってみる
### install
https://golang.org/doc/install からDowloadしてくる。
`go version`でGoのバージョンが表示されればOK。

“`
C:\Users\user>go version
go version go1.16.7 windows/amd64
“`

### hello world
[はじめてのGo](https://github.com/yuta-katayama-23/Go/commit/a24dbd81df6ebc32e0bb739b9b50a54f7c91e136)

“`golang:hello
package main

import “fmt”

func main() {
fmt.Println(“Hello, World!”)
}
“`

実行結果は以下のようになる。
CIでGoを動かすのに使った

元記事を表示

OTHERカテゴリの最新記事