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

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

Goを触る②

[こちら](https://qiita.com/iskn19/items/a603e7a56283df819965#%E5%A4%89%E6%95%B0)の続き

# 変数
関数はfuncで定義

“`go
func add(hoge int, fuga int) int {
return hoge + fuga
}
“`
“`{“` 前の型で戻り値の型を宣言
“`return“` で戻り値を設定

戻り値が複数の場合は型名は “`(,) “`で設定する必要がある

“`go
func addMinus(x int, y int) (int, int) {
return x + y, x – y
}
“`
ブランク変数を使って必要な値のみ取得する
“`go
package main
import “fmt”

func main() {
var a string
_ , a = hoge(“sss”,”sssssss”)
fmt.Println(a)
}
func hoge(x string, y string) (string, st

元記事を表示

Go言語でunit testをしたい

# はじめに
最近Go言語を最近初めてTDD的な個人開発を行いたかったので自分用のメモとしてGo言語のunittestの書き方をまとめました。

# Go言語でのunittestの書き方
#### testファイルの作成
まずは、テストしたい関数と同階層に`<ファイル名>_test.go`というファイルを作成しましょう。今回は`Hello.go`をテストする`Hello_test.go`を作成しました。
“`
.
├── Hello.go
└── Hello_test.go
“`

#### `Hello_test.go`の記述
続いてテストコードを書きましょう。`Hello()`に名前を渡すと`Hello, <名前>!`と帰ってくるプログラムをテストします。
“`Hello_test.go
package main

import (
“testing”
)

func TestHelloName_名前出力のテスト(t *testing.T) {
name := “abemaru”
want := “Hello, abemaru”
msg, err := Hello(n

元記事を表示

簡潔なGoと簡単なJavaのどちらを選択するか

最近 Go言語を個人的に勉強しているのですが、そのときに思ったことを Java と比較しながら書いてみようと思います。

# Go言語とは

皆さん、そもそも [Go言語](https://go.dev/)って知っていますか?
Go言語はGoogleが開発したオープンソースのプログラミング言語です。「Go」や「Golang」と呼ばれます。

特徴としては、「簡潔な記述ができる」、「軽量な並列処理が可能」などがあげられます。

Go言語は色々なところで利用されており、Web だと API サーバの実装に利用されることが多くなっています。
また、クロスコンパイル(Windows/Mac/Linux 用のコンパイル)が可能であるため、CLI ツールの作成などに利用されることも多々あります。有名どころだと「[docker](https://github.com/docker/cli)」の CLI なんかが go 言語で作成されています。(先程のリンク先を見てみると、「.go」ファイルがちらほらありますね。)

# 簡潔な記述ができるとは?

元記事を表示

Go言語でディレクトリ内のファイルを取得する方法

# はじめに
ディレクトリ内のファイル一覧を取得する方法を調べると、3つ見つかったので備忘録として残しておきます。

# 前提
確認のため、最小構成で実行しています。今回は以下のような場面での使用を想定しています。
“`terminal
% tree
.
├── input
│ ├── abc.jpeg
│ ├── folder
│ │ └── in_folder.jpg
│ └── test.jpg
└── main.go
“`

# 方法
### `ioutil.ReadDir`
`ReadDir`で指定したディレクトリを読み込み、ファイル名でソートし、表示されます。サブディレクトリ内のファイルは表示されません。
“`main.go
package main

import (
“fmt”
“io/ioutil”
)

func main() {
files, _ := ioutil.ReadDir(“input”)

for _, f := range files {
fmt.Println(f.Name())
}
}
“`

“`

元記事を表示

go で unix timestamp を zone指定のTime型に変換するメモ

# 実装

“`go
jst, _ := time.LoadLocation(“Asia/Tokyo”)
dt := time.Unix(1657616356, 0).In(jst)
“`
# 参考

https://pkg.go.dev/time#Unix

https://pkg.go.dev/time#Time.In

https://qiita.com/yyoshiki41/items/3acfe3c03b5a3a1e7592

元記事を表示

Golang初心者がGo導入(macOS)と詰まったところ ~ VSCode設定まで ~

専門はフロントエンドマンの導入メモ。

GoでSQLを叩きたいと思って触っています。
Golangのチュートリアルであるgo tourをインストするまでと、VSCodeの設定まで紹介。
インテルチップのmacに導入しています。

## インストール

“`
$ brew install go
“`

もしくは pkg を GUI操作で DL するパターンもあります。
公式:https://go.dev/doc/install

### バージョン確認

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

バージョンチェックできればOKです。

“`
$ go env
“`
GOPATHの違いにより怒られた場合は go env で確認して見ましょう。

“`
export GOPATH=$HOME/go
“`
などで実際のパスに合わせて変更。それからターミナル自身をリロードするか source ~/.zshrc で使用しているシェルのパスを更新。

## Go Tourを入れる

“`
go install gol

元記事を表示

Selenium入門と安定稼働させためのオプション by golang

# 概要
Go言語でSeleniumを使おうという記事です。
基本的な使い方と、安定稼働させるためのWeb Driverのオプションを紹介しています。
オプションについてはどのプログラム言語でも同じですので、PythonやJavaをお使いの方でも同じオプションが使えます。

# 事前準備
Seleniumを使うのに必要な準備はどのプラットフォームでも同じでしょう。
今回はGoogle Chromeを使いますので、Google Chrome本体のインストールと、Google ChromeのWeb DriverをダウンロードしてPath配下に配置しておきます。
[google chrome webdriverダウンロード](https://chromedriver.chromium.org/downloads)

# 基本的な使い方
GoでSeleniumを扱うのには、agouti というライブラリが定番です。
以下は一番簡単なサンプルとして、googleを表示して、タイトルを表示するだけのものです。
“`go
package main

import (
“fmt”

“gith

元記事を表示

Goで並行ダウンロードするならとりあえずこれ書いとけ

# ソースコード

“`golang
package main

import (
“context”
“fmt”
“io”
“log”
“net/http”
“net/url”
“os”
“strings”
“sync”

“golang.org/x/sync/semaphore”
)

func downloadParallel(urls []string) {
var wg sync.WaitGroup
var s = semaphore.NewWeighted(5) // 同時実行するgoroutineの数を指定
for _, u := range urls {
wg.Add(1)
go downloadFromURL(u, &wg, s)
}
wg.Wait() // goroutineに投げた全ての処理が終了するまで待機
}

func downloadFromURL(_url string, wg *sync.WaitGroup, s *semaphore.Weighted) {
defer wg.Done() // この関数の実

元記事を表示

どこからでもDatabricks SQLに接続する

[Connect From Anywhere to Databricks SQL \- The Databricks Blog](https://databricks.com/blog/2022/06/29/connect-from-anywhere-to-databricks-sql.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# Databricks SQL向けGo、Node.js、Python、CLIオープンソースコネクターの発表

開発者がお好きなアプリケーションからDatabricks SQLへの接続をシンプルにできるようにするために、本日、[Go](https://github.com/databricks/databricks-sql-go)、[Node\.js](https://github.com/databricks/databricks-sql-nodejs)、[Python](https://github.com/databricks/datab

元記事を表示

go.mod file not found in current directory or any parent directoryと言われたら公式チュートリアルを見よう

# はじめに
最近Go言語を触り初めて、よく`go.mod`がないよと怒られるので、備忘録として残しておきます。

もしくは[公式のチュートリアル](https://go.dev/doc/tutorial/create-module)を参照しましょう。

# 結論
#### `go mod init`を実行しよう
以下を実行して`go.mod`ファイルを作成しましょう。
“`
% go mod init “`

#### `go get`で使用するgitリポジトリを指定しよう
以下のように外部のリポジトリを使用する場合は指定しましょう。下のリポジトリは例です。
“`
% go get github.com/rwcarlsen/goexif/exif
“`

元記事を表示

DockerのLambdaコンテナイメージをgolangで動かしてみた

AWSで公開されているgolangのLambdaコンテナイメージを動かしてみました。

## パッケージの構成
“`
├── docker
│   └── lambda-go-test
│   └── Dockerfile
├── docker-compose.yml
└── lambda
├── go.mod
├── go.sum
├── main
├── main.go
└── pkg
“`

## Dockerファイル作成
[こちら](https://gallery.ecr.aws/lambda/go)を参考にDockerファイル等を作成。
“`dockerfile
FROM public.ecr.aws/lambda/go:1

# Copy function code
COPY ../../lambda ${LAMBDA_TASK_ROOT}

WORKDIR ${LAMBDA_TASK_ROOT}
# golangをinstall
RUN yum install -y golang

# Set the CMD to y

元記事を表示

Goの競技プログラミングチートシート

# このチートシートについて

「**Trackなどのコードテスト**」や「**Atcoder**」や「**Paiza**」などといった競技プログラミングでよく使われる処理をサンプルコードとして書いていきます。

また、何か追加情報やより良いものなど変更があった場合は更新していきます。

:::note warn
私自信が競技プログラミングを受けた時に、頻出したコードを随時更新していきます。

なので、実際には足りていないところもあると思います。
そこはご了承いただけると幸いです。
:::

# 概要
自動の目次生成のあるがあるため必要ないかもしれないが、念の為目次の作成

|No|概要|
|:–|:–:|
|1| [標準出力](#標準出力) |
|2| [標準入力](#標準入力) |
|3| [文字列分割して配列に格納](#文字列分割して配列に格納) |
|4|[文字列、整数変換](#文字列、整数変換)|
|5|[スライス](#スライス) |
|6| [マップ](#マップ) |
|7| [ソート](#ソート) |

## 標準出力
主に使われる、**fmt.Println()

元記事を表示

gorm & sqliteで時刻を上手に扱う方法

gormはgo言語でSQLを扱うためのORMパッケージ。
sqliteを扱うときに時刻で想定外の挙動となったため、調査した。
※sqliteは時刻型に対応しておらず、文字列型として扱う。そこに由来する問題だと思う。

https://gorm.io/ja_JP/docs/index.html

# 問題
localTimeやフォーマットのずれが出てくるため、単純に time.Now() を使ってinsert や select させると、想定通りに動作しなかった。

# 対処方針
unixtimeに揃えたり、timeのフォーマット(文字列)を意識して揃えたりすることでおそらく正常に動作する。

# 対策1 unixtimeに統一する

`CreatedAt int64`  などに揃える。
これがシンプルで確実そうではあるのだが、 `time.Time` のまま使いたいときはちょっと不満が残る。

# 対策2 文字列フォーマットを意識して操作する

`timeFormat = “2006-01-02 15:04:05.000-07:00″` を利用して、insertもselectも

元記事を表示

Go言語でディレクトリを作成する方法

# はじめに
Pythonメインだったのですが、興味があってGo言語の勉強をしています。
趣味で撮った写真を自動で振り分ける際にディレクトリの作成を調べたのでまとめておきます。

さらに詳しい操作については[公式ドキュメント](https://pkg.go.dev/os)を参照しましょう。

#### 2022/7/11 00:59追記
`os.Mkdir(“test”, os.ModePerm)`と記載していましたが、`os.ModePerm`は[使用しない](https://twitter.com/mattn_jp/status/1546038794637672451?s=20&t=bqbMFn2ZyLs3fXdvc97QcA)みたいです。調べてみて`FileInfo.Mode() & os.ModePerm`を利用した方法に変更しましたが、間違っていたら教えていただえると嬉しいです!

# ディレクトリを作成する方法
以下のコードを`main.go`に記載し、`go run main.go`を実行すれば実行したディレクトリで`/test`が作成されているはずです。

“`
p

元記事を表示

ApacheBeam-Tutorial(GoLangVersion)

Apacheのアプリを調べてたところ、AzureDataFactoryのようなものを発見しました。
こちらになります。

https://beam.apache.org/

SaaSではなく、コードベースになっているデータインテグレーションフレームワークになります。
まだ詳しくない状況ですが、GUI等がないので、直感的にわかりにくいです。
これを使う利点として、他のApacheのアプリと結合しやすい点ぐらいしか思い浮かばないのです。

早速ですが、上記のページの公式ドキュメントについて説明になります。

## 使うテストデータ
Apache Beamのところから適当に取得しました。
ここはセットしたいデータで問題ないです。
“`text
The SDK-provided Count transform is a generic transform that takes a PCollection of any type, and returns a PCollection of key/value pairs. Each key represents a unique element

元記事を表示

Golangで学ぶGithubActions入門

## Github actionsでできること
より良い開発者体験や開発効率を求めてCI/CDの構築は今や欠かせないものになりつつあります。
そこで、Github actionsでどのようにCI/CDを構築すればよいか、開発にGolangを使っている場合をサンプルに説明します。Github actionsをこれから始めていく人が概要を掴みやすい内容の記事になっています。

初めにGithub actionsの説明について見ていきます。
以下は公式サイトからの引用です。
>ソフトウェア開発ワークフローをリポジトリの中で自動化し、カスタマイズし、実行しましょう。
CI/CDを含む好きなジョブを実行してくれるアクションを、見つけたり、作成したり、共有したり、完全にカスタマイズされたワークフロー中でアクションを組み合わせたりできます。

要するにソフトウェア開発の中でやらないといけない作業を自動化することができ、それを自分の好きなようにカスタマイズできるということができるみたいです。

## 自動化できること
では、Github actionsで何が自動化できるのでしょうか。
主によく使われる

元記事を表示

【Golang】json.Marshal のエラーをテストする【json.MarshalIndent 含む失敗ケースの作成】

> Go 言語(以下 Golang)で、俺様関数内の `json.Marshal`/`json.MarshalIndent` を失敗させたい。つまり、**JSON 変換に失敗するテスト・ケースが欲しい**。

“`go:テストしたい関数
type Foo int

func (f Foo) Dump(w io.Writer) (n int, err error) {
if w == nil {
return 0, errors.New(“dump failed: the io.Writer w is nil”)
}

byteJSON, err := json.Marshal(f)
if err != nil {
// ここのエラーに、たどり着けない
return 0, errors.Wrap(err, “dump failed: can not marshal NodeLog to JSON”)
}

return w.Write(byteJSON)
}
“`
– [オンラインでユニット・テストをみる](https://go.dev/play/

元記事を表示

DDDをざっくり理解してみる② ~ドメインサービスとリポジトリ編~

# はじめに
この記事は以下の続きです。まだご覧になっていない方はまずこちらお目通しください。

https://qiita.com/2san/items/eb9d7df6961542069233

今回も以下書籍を参考にさせていただいております。

# 前回の復習
– ドメイン

元記事を表示

Let’s EncryptでHTTPSを終端させたいだけならNginxよりCaddyを使うと楽だった件

みなさん!Webサーバ立ててますか?HTTPSしてますか?

弊社でも、よく自社向けの開発サーバをDockerで立てており、開発サービスは生HTTPで運用、そのフロントにHTTPS終端用のNginxをたてて、その証明書はメンテ&費用フリーの[Let’s Encrypt](https://letsencrypt.org/ja/)で取得するようにしています。

“`
インターネット → (HTTPS) → [ Nginx → (HTTP) → 開発サービス ]
“`

こういうDockerでLet’s EncryptでHTTPSしたいだけなら、同一のDockerネットワークに特定条件のDockerコンテナが生えるたびにNginxファイルを動的生成してLet’s Encryptの[ACME](https://ja.wikipedia.org/wiki/Automated_Certificate_Management_Environment)も通してなど全部やってくれる、下記を組み合わせるのが定番なのですが、

– [nginx-proxy](https://github.com/ngin

元記事を表示

Cloud Run + API Gateway で自作 API を作って検証してみた

本記事は note にて有料記事で公開しています m(_ _)m

https://note.com/wezardnet/n/nf2d413ba49b0

元記事を表示

OTHERカテゴリの最新記事