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

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

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
  -

###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を使っています。スライスは関数の引数として使う場合は、ポインタを使うべきかどうかを説明いたします。

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

元記事を表示

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を動かすのに使った

元記事を表示

ECHOのCORS設定

## エラー

– ReactNativeとExpoで作ったフロント側から呼び出すと以下のエラーが表示される

“`
Access to fetch at ‘http://localhost:1323/user/search’ from origin ‘http://localhost:19006’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.
“`

– Access-Control-Allow-Originがヘッダーにありませんみたいな

#

元記事を表示

beego AjaxでCSRF対策を独自実装する と思ったらしなくても良かった件

# はじめに
go言語のwebframework beegoにはCSRF対策が実装されています。

https://beego.me/docs/mvc/controller/xsrf.md

CSRFとは

https://www.trendmicro.com/ja_jp/security-intelligence/research-reports/threat-solution/csrf.html

説明は不要かと思いますが、CSRFとは他サイトを経由した
不正なリクエストによってサイトを攻撃する手法です。

CSRF対策の一つとしてbeegoでも採用されているのがトークンを使った対策です。
サーバに保存されたトークンとリクエストにあるトークンが一致しているかを
判定することによって不正なリクエストでないことを証明します。

公式サイトを読むと・・・
POSTの場合、configにパラメータを記載すればcookieに_xsrfをセットするよ
PUTとDELETEの場合、cookieに

元記事を表示

Gopherエンジニア面接質問 fmt.Println(uint(1) – uint(2))の結果は?

###背景
一つGo言語の面接質問を紹介します
以下の出力結果はなんですか?

“`go
package main

import (
“fmt”
)

func main() {
a := uint(0)
b := uint(1)
fmt.Println(a – b)
}
“`

面接質問だから、明らかに-1ではないですね
この質問の正確な答えは

“`
uintの最大値が出力されます
PCは32bitの場合は、uint32の最大値になり、2**32-1 になります,
PCは64bitの場合は、uinit64の最大値になり、2**64-1になります
“`
※ なお、以下の公式サイトによるとuint64の最大値は18446744073709551615になり、2**64-1まではいかないです。
> uint64 is the set of all unsigned 64-bit integers. Range: 0 through 18446744073709551615.

https://pkg.go.dev/builtin#uint64

###解説
まずaと

元記事を表示

Golangはじめて物語(第9話: Go SQL Drivers+AWS SDK for the GoでAuroraに高速アクセスする)

# はじめに
GolangのDB接続は内部でGoroutineを使って勝手に簡単にコネクションプールを実現してくれるらしい。
なんと素晴らしい。早速試してみようではないか。
せっかくだから、Auroraと組み合わせてみよう。

なお、Auroraへのアクセス方法については、[公式のユーザーガイド](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.IAMDBAuth.Connecting.Go.html)が参考になる。

また、接続にはIAM認証を用いる。AuroraへのIAM認証の設定方法は、[この記事](https://qiita.com/neruneruo/items/359faa76c2c8990439f2)を参考にしていただきたい。

# ファイル構成
今回は、WebサーバのフレームワークからAuroraに接続するサンプルとして、Ginを用いる。
以下のようなファイル構成とする。

“`
.
├── Dockerfile
├── docker-compose.yml

元記事を表示

Golang で YAML をシリアライズ、デシリアライズする

# Golang で YAML をシリアライズ、デシリアライズする

こんにちは、最近 YAML をなんとなく触っていたのですが、いまいち理解していない部分もあり、また IaC の勉強を始めてみたり、 Golang でデシリアライズする必要が出てきたりと、今後のことを考えてここで解説メモを残しておこうと思いました。

# YAMLについて
YAML Ain’t Markup Language (YAML) はシリアライズ言語、
YAML はこの数年で着実に進化しており、わりと人気が出てきているイメージです。

YAML のメリットはコメントを記述できたり、インデントで区切っている点など、何より人間にとって読みやすいというのが大きなメリットだと思います。

YAML は主に何に使われるかというと、設定ファイルのフォーマットに使われることが多いです。
このシリアライズする言語の能力に関して JSON のような言語に置き換えられることがよく見られてます。

今回はYAMLの文法を Golang でデシリアライズしながら見ていきたいと思います。

# サンプルファイルで YAML を見ていきま

元記事を表示

Ginの実行環境作成

最近、Googleで調べものしているときやSNSでよく目にするGoですが、どうやらWebフレームワークも存在しており、標準ライブラリとはどう違うのかをみるべく、まずはフレームワークの一つであるGinのパッケージをインストールしてみようと思います。

#Ginとは
Ginは、Go言語で記述されたWebフレームワークです。httprouterのおかげで最大40倍高速なパフォーマンスを備えたMartiniのようなAPIを備えています。パフォーマンスと優れた生産性が必要な場合は、Ginを気に入るはずです。
引用:[Gin公式GitHub](https://github.com/gin-gonic/gin#gin-web-framework)

#作業環境
OS:Windows10 Home
プロセッサ:Intel(R) Core(TM) i5-3210M CPU2.50 GHz
RAM:8.00 GB (7.88 GB 使用可能)

Go:1.16.7 windows/amd64

#Ginのインストール
Gin公式GitHubの[README](https://github.com/gin-

元記事を表示

AWS ESC Fargate & ECR で Golang の Webアプリをデプロイする

# はじめに
現職の現場ではプライベートクラウドを使用していて、本番環境の運用をAWSのようなパブリッククラウドを使用して、さらにECSのようなコンテナ基盤での運用ができていない。
docker imageを使用してコンテナ基盤で運用をすると本番環境の運用及び、本番環境へのデプロイ作業がものすごく楽になりそうなので、学習してみた。
この記事では、ローカル環境でdocker imageをビルドして、AWSのECRにプッシュ、その後ECSでデプロイを完了させるところまでを解説してみる。

# ローカルにて
ビルドしたいDockerfileがおいてあるディレクトリと同じ階層でビルドする

“`
docker build -t image_name .
“`

ビルドしたimageにタグ付けをする。
この辺りのコマンドは、ECRにてリポジトリを作成したのち、AWSのコンソール上でもわかりやすくpushコマンドが説明されているので迷うことがあんまりなさそう。

“`
docker tag image_name aws_account_id.dkr.ecr.region.amazonaws

元記事を表示

Go言語クロージャーについての豆知識

###背景###
for分の中に関数を書くときに、特にfor分のスコープと関数の組み合わせによって、クロージャーが生成され、関数の実行タイミングはfor分と一致ではない場合は、バグは発生しやすいです。
例えば、javascriptでは以下のようなクロージャー典型例があります。
[Javascriptの豆知識(let,var,クロージャーに関する面接問題)](https://qiita.com/xu1718191411/items/88dee669da14bc8ba749 “Javascriptの豆知識(let,var,クロージャーに関する面接問題”)

Javascriptではletという変数宣言方法を活かすことによって、うまくfor分共にあるクロージャー問題点を解消できますが、Go言語だと、どうやって解消できますでしょうか

####問題####
#####コード#####

“`golang
func main() {
n := 5

funcs := []func(){}

for i:=0;i

元記事を表示

Go 言語スプレッドシートライブラリ:Excelize 2.4.1 がリリースされました

Go 言語スプレッドシートライブラリ:Excelize 2.4.1 がリリースされました

[Excelize](https://github.com/xuri/excelize) は、純粋な Go で記述されたライブラリで、XLSX / XLSM / XLTM ファイルの読み書きを可能にする一連の関数を提供します。Microsoft Excel™ 2007 以降で生成されたスプレッドシートドキュメントの読み取りと書き込みをサポートします。 高い互換性により複雑なコンポーネントをサポートし、大量のデータを含むワークシートからデータを生成または読み取るためのストリーミング API を提供します。

場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新

元記事を表示

【Golang】【wasm】テストの仕方と注意点 @ Go 1.16+

## WebAssembly 用のアプリでもテストがしたい

> `go test` でテストを実行すると `exec format error` や `imports syscall/js` エラーが出る。
>
> “`text
> fork/exec /tmp/go-buildxxxxxxxxx/xxxx/my_pkg_hoge.test: exec format error
> “`
> “`text
> imports syscall/js: build constraints exclude all Go files in /usr/local/go/src/syscall/js
> “`

– 検証環境: Go 1.15.6(`golang:1.15-alpine`), 1.16.5(`tinygo/tinygo:latest`), 1.16.6(`golang:alpine`)(いずれも Docker 環境)

## TL; DR (今北産業)

1. `node.js` をイ

元記事を表示

【Golang】image パッケージの Bounds とは(四角が描画された画像を作成したい)

> Go 言語(Golang)のテストで使う画像を作りたい。作り方を調べると出てくる `Bounds` ってどう言う意味?

[「”golang” 画像 描画 四角」でググって](https://www.google.com/search?q=%22golang%22+%E7%94%BB%E5%83%8F+%E6%8F%8F%E7%94%BB+%E5%9B%9B%E8%A7%92)も[「”golang” image boundsとは」でググって](https://www.google.com/search?q=%22golang%22+image+bounds%E3%81%A8%E3%81%AF)も何かよくわからなかったり、Go v1.16 系では動かなかったので、自分のググラビリティとして。

## TL; DR (今北産業)

1. `Bounds()` の `Bound` は「境界」や「隣接する範囲」などの意味。
日本語で言う**「バウンド」の「跳ね返る」ではありませ

元記事を表示

Goのインストールとチュートリアルメモ

Go使ったことない人間がGoのインストールしてから[公式](https://golang.org/doc/install)のチュートリアル進めて行くにあたって躓いた点などをメモ。
なおMac前提。(随時追記)

# インストール
* [公式](https://golang.org/doc/install)から最新版をダウンロードしてインストールする
* よくわからんけどgoコマンドが `command not found` になってしまうっ……!ってなったので、~/.bash_profileをいじいじしてパスを通す。

“`~/.bash_profile
# goのインストール先は/usr/local/goになる
export PATH=”/usr/local/go/bin:$PATH”
“`

そんでもってターミナル再起動かsourceで再読み込み

“`
$ source ~/.bash_profile
“`

これでようやくgoコマンドが動いた

“`
$ go version
go version go1.16.6 darwin/amd64
“`

`$GOPAT

元記事を表示

OTHERカテゴリの最新記事