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

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

競プロ落とし穴 #1 SetでDFS

# 競プロ落とし穴シリーズ
シリーズと書いてるけど多分これが初回で最終回:hugging:
競プロの問題を解いていてつまづいたところをメモしていくよ

# 今回解いていた問題
https://atcoder.jp/contests/abc198/tasks/abc198_d

出現する文字列(たかだか10種類)について全探索を行って条件を満たす解を探す問題

以下では簡略化したコードで考えていくよ

# 間違ったコード
“`golang
func AssignWithSet(N int) {
set := make(map[int]struct{})
for i := 0; i < N; i++ { set[i] = struct{}{} } ret := make(map[int]int) used := make(map[int]bool) for v := range set { ret[v] = -1 } scnt := 0 var DFSWithSet func(int) DFSWithSet = func(num int) { if num

元記事を表示

Go言語 無名関数の書き方

Go言語の無名関数の記事が少ないので、ここでいくつか例を上げたいと思います。

## 環境
go 1.18

## 例1 : 即時実行
“`go:input
package main

import “fmt”

func main() {

// 無名関数
func() {

fmt.Println(“Welcome! to Go Lang”)
}()

}
“`

“`terminal:ouput
Welcome! to Go Lang
“`
## 例2 : 変数に代入してから実行
Go言語では無名関数を変数に割り当てる事ができます。
無名関数を変数に割り当てると、その変数は関数型となり、関数をコールするようにその変数をコールする事ができます。
“`go:input
package main

import “fmt”

func main() {

// 変数に無名関数を割り当て
value := func() {
fmt.Println(“Welcome! to Go Lang”)
}
value()

}
“`

“`terminal:ou

元記事を表示

golangci-lint: exhaustivestruct

備忘録。

構造体のフィールドが全部初期化されているかどうかをチェックしたい場合は[exhaustivestruct](https://github.com/mbilski/exhaustivestruct)が便利。
exhaustivestructを有効化した上でstruct-patternsに構造体が [Path#Match](https://pkg.go.dev/path#Match) に合致するように記載する。
struct-patternsはパッケージ名も含められるので別パッケージで同名の構造体があっても対応できる。

ハマったポイントとして、struct-patternsに指定するのはチェックしたい構造体が定義されているパッケージおよび構造体名を指定する必要がある点。
勘違いしてチェックしたい構造体が呼び出されているパッケージ名を指定しようとしていた。

“`go
package exampleA

type Target {
Hoge string
}

package main

func main() {
t := Target{}
}
“`
上記の場合、

元記事を表示

Go言語 ゴルーチン select

## select
複数のゴルーチンからの、チャネルを介した値受け渡しを実現させるための構文
selectを使用することにより対象のチャネルからピンポイントで値を受け渡せる。

## Code
“`Go
// ある数以上の素数を、1つ求める関数
func primeRoutine(targetLine int, primeChan chan int) {
fmt.Printf(“%d Line Target Goroutine Wake UP \n”, targetLine)
i := 0
for {
// 値のインクリメント
i++
// 素数チェック
if checkPrime(i) && targetLine < i { fmt.Printf("%d Line Target Goroutine Shut Down \n", targetLine) // チャネルにデータ送信 primeChan <- i return } } } // メイン関数 func main() { // 求める素数の基準値 targetLin

元記事を表示

【GitHub】Goのインデントがおかしい問題を解決する

## 原因
GitHub上でデフォルトのタブサイズが8になっているから。
つまり、`1tab = 8 半角スペース`という状況です。

## 解決策
1. `https://github.com/settings/appearance`へ行きます。
1. Tab Sizeを4にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611835/6301cf1b-1933-9747-becb-fe173ccc7698.png)

## 余談
chromeの拡張機能だったり、クエリパラメータでタブサイズを変える方法がググると出てきたのですが、最近デフォルトの設定になったんですかね?

元記事を表示

Rocky Linux 8.4にGo環境をインストール(Linux)

linuxのOSにGo環境をインストールする手順です。

今回はRocky Linux 8.4を使用しています
※Centos8系は同手順で同様にインストールできる認識

手順

cd /usr/local

バージョン15をインストール(2022年4月時点の最新バージョンは17)

wget https://golang.org/dl/go1.15.2.linux-amd64.tar.gz

tar -C /usr/local -xzf go1.15.2.linux-amd64.tar.gz

rm -rf go1.15.2.linux-amd64.tar.gz

バージョン確認

go version
go version go1.15.2 linux/amd64

環境変数を設定

vi .bash_profile

export ROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$ROOT/bin

#設定後読み込み

元記事を表示

golangにおける関数の引数

“`golang“`を勉強していて以下のような書き方を見て、よく分からなかったので調べてまとめてみようとおもいます

“`
type Item struct{
name string
price init
}

func itempointer(i *Item){
fmt.Println(*i)
}
“`

“`golang“`にはポインタの概念が存在していて、関数の引数の型に値型や、ポインタ型を指定できます。
上のコードのように記述することで、構造体の要素の型を**コピー**しているんです。

短いですが、以上です。
何か間違いがございましたら、ご教示いただけますと幸いです。

【参考資料】

https://go.dev/doc/faq#Pointers

https://yyh-gl.github.io/tech-blog/blog/go-always-passing-by-value/

元記事を表示

【Go, go-cmp】子インスタンスの並びを気にせずに比較したい

SortSlicesだと子インスタンスで持つ値がバラバラの場合、無視することが出来ないが[Transformer](https://pkg.go.dev/github.com/google/go-cmp/cmp?utm_source=godoc#Transformer)だと出来る。

NumSlice構造体で持つNumsの順番がバラバラな構造体を作る。

“`golang
func TestSortSlice5(t *testing.T) {

type NumSlice struct {
Id int
Nums []int
}

type Compare struct {
NumSlice NumSlice
}

v1 := &Compare{
NumSlice: NumSlice{Id: 1, Nums: []int{1, 2, 3, 4, 5}}, // 昇順
}
v2 := &Compare{
NumSlice: NumSlice{Id: 1, Nums: []int{5, 4, 3, 2, 1}}, // 降順
}

opts :

元記事を表示

【Docker】1分でローカルにGoの環境構築をする

# 本記事について
Go言語の環境をdockerを用いて構築します。dockerさえインストールしてれば秒で環境構築できます。
パッケージ管理にGo modulesを使っています

開発環境用です。

## 環境構築

### Dockerfileを用意する

“`Dockerfile:Dockerfile
FROM golang:1.16-alpine

WORKDIR /app

COPY go.mod ./
COPY go.sum ./
RUN go mod download

COPY *.go ./

RUN go build -o /docker-gs-ping

EXPOSE 8080

CMD [ “/docker-gs-ping” ]
“`

参照: [docker docs](https://matsuand.github.io/docs.docker.jp.onthefly/language/golang/build-images/)

### 必要ファイルを用意する

まずはGo modulesを開始するコマンド

“`
$ go mod init ex

元記事を表示

Go言語 チャネル

## チャネル
チャネルとは、平行実行されているGoroutineから値を受け渡す機能である。

## Code
“`Go
// ある数以上の素数を求める関数
func primeRoutine(targetLine int, primeChan chan int) {
i := 0
for {
// 値のインクリメント
i++
// 素数チェック
if checkPrime(i) && targetLine < i { // チャネルにデータ送信 primeChan <- i //[キーポイント] } } } // メイン関数 func main() { // 求める素数の基準値 targetLine := 100000 // チャネルの作成 primeChan := make(chan int) // ゴルーチンで素数を求める go primeRoutine(targetLine, primeChan) // チャネルからデータを受信 primeResult := <-primeChan //[キーポイント]

元記事を表示

Goのshadowingでハマる前にVSCodeの設定を見直すべし

# GoにおけるShadowとは?

こちらの記事に詳しいですが、要は**変数の再定義**のことです。
予期せぬバグの温床になるので気をつけましょう。

https://yourbasic.org/golang/gotcha-shadowing-variables/

`go vet –shadow GO_FILE`
で検知できるのですが、IDEでリアルタイムに検知したいところですよね。

というわけで以下です。

# VSCodeで–shadow機能を有効化する

UserでもWorkspaceでもどちらでも良いので、`settings.json` に以下を追記しておきましょう。

“`json
{
“gopls”: {
“analyses”: {
“shadow”: true
}
}
}
“`

# Golandで–shadow機能を有効化する

この方の記事に詳しいです。

https://zenn.dev/uuusu/articles/6554631b4c08ba

元記事を表示

GoでMarkdownからExcel試験書を作成するソフトを作った

## 入力

![スクリーンショット 2022-04-12 101539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792099/d5526e0b-0757-bf73-cac8-3b0eba8564b1.png)

[このmd文書](https://github.com/botanic7arc/markdown2excel/blob/master/src/test.md)を入力すると

## 出力

![スクリーンショット 2022-04-12 100844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792099/3745d43d-cff0-85f2-ef4b-5ca90c564551.png)

こうなります。(横が入りきらなかったため、縮小して表示しています)

## ソース

https://github.com/botanic7arc/markdown2excel/tree/master/src

##

元記事を表示

Go言語製Let’s Encryptクライアントlegoをライブラリとして使う

ピリカではほとんどのサービスでGCPやAWSが発行するHTTPS証明書を使っていますが、見える化ページと呼ばれる、自治体や企業など、一定の範囲内でのごみ拾い活動を集約しているサービスで使っているワイルドカード証明書はLet’s Encryptで発行しています。

Let’s Encryptで証明書発行するためのクライアントとしては標準のcertbotの他にもいろいろなものがあります。
個人的に、[lego](https://github.com/go-acme/lego)を気に入って使っています。お気に入りポイントはこんな感じです。

– Go言語で作られていて、Pythonの言語環境に依存せずに使える
– いろいろなDNSサービスに対応している
– コマンドラインがcertbotよりもわかりやすい

コマンドとしてずっと使っていて、このコマンドを内部的に使用する形で証明書を自動更新をするCloud Runを作ろうとしていたのですが、改めてリファレンスを読んでいたところ[ライブラリとしても運用できる](https://go-acme.github.io/lego/usage/libra

元記事を表示

ubuntuでgo関連のパッケージをインストールした時のメモ

## やりたかったこと
こちらのパッケージをubuntuのサーバーに入れようとした

https://github.com/prasmussen/gdrive

README.mdには、ソースからのインストールは下記のコマンドでやろうということだった

“`
go get github.com/prasmussen/gdrive
“`

そうかgoがいるのか、と思いapt-getでgoをインストールした後に`go get`のコマンドを実行しようとしたらハマったのでメモ。

### 間違えた手順と発生したエラー

“`bash
sudo apt-get golang
go get github.com/prasmussen/gdrive
“`
でインストールしようとしたところ、`go get`のところでこんなエラーが
“`
package context: unrecognized import path “context” (import path does not begin with hostname)
“`

どうやらバージョン問題っぽい。apt-getで入れると古い

元記事を表示

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

![Go 言語スプレッドシートライブラリ:Excelize 2.6.0 がリリースされました](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144042/638b0c2d-0c22-396d-1c1b-090b83ef4f35.png)

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

場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新しい Excel ドキュメントの作成、既存のドキュメント(テンプレート)に基づく新しい Excel ドキュメントの生成、Excel

元記事を表示

Go言語 パッケージ

## Package
Goのプログラムは、全て何らかのパッケージに属する。
Importによって指定することにより、対象のパッケージが使用できるようになる。
また、1つのパッケージ内で、複数のソースコードファイルを使用してプログラムを定義できる。
変数や関数の頭文字を大文字にすれば、他のパッケージから参照出来るようになる。

## Code
“`Go
package main

import (
“fmt”
“./calculation”
)

// Main function
func main() {

// Calculation with functions in the calculation package
add := calculation.CalcAdd(10, 5)
sub := calculation.CalcSub(10, 5)
multi := calculation.CalcMulti(10, 5)
div := calculation.CalcDiv(10, 5)

// Output Value
fmt.Printf(“A

元記事を表示

goで実装した関数をpythonから呼び出す

# やりたいこと

下図のようにGoで記述した関数をPythonから呼び出します。

まずはGoプログラムをビルドして共有ライブラリ(※)を作成し、ビルドした共有ライブラリをPythonから呼び出します。
※ Linuxだと共有ライブラリ`.so`、Windowsだとダイナミックライブラリ`.dll`。

![イメージ図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/7828f3da-acb2-d688-5724-530b60686929.png)

# 1. 共有ライブラリを作成

まずはGoでスクリプトを記述します。
記述する上でのポイントは以下です。

– package名はmainにする
– main関数を記述する
– 特殊コメントの`export`を記述する

“`go:test.go
// package名はmainにする
package main

import (
“fmt”
“C”
)

func main() {
// main関数を記述
}

元記事を表示

M1MacでGo/Ginの環境を作った過程

# はじめに
もともとWindowsユーザーだったけど、2022年01月からM1Macに変えました。
ただでさえ新しいガジェット(Mac)なのに、最新チップ(M1)でやったことない言語(Go)のさっき知ったフレームワーク(Gin)の環境を準備しようとしているんだから大変に決まってるよね。
だって記事がないんだもの。

そして、この記事はただの記録用です。
自分がこの後沼にハマる(確信)時に何をしたかを覚えておくためです。

**だからこの記事正しくないと思うよ!**

## 諸々のバージョン
Go: 1.18
OS: MacOS
チップ: M1

## Goのダウンロード&インストール
(やめればいいのに)最新verをインストールしました。
**go1.18.darwin-arm64.pkg**
です。

![スクリーンショット 2022-04-11 1.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437352/e9f27a3e-f255-a169-96a0-2bca011dd3d1.pn

元記事を表示

Lambda function URLsをTerraformでお手軽構築する

# はじめに
4/7に突如登場したLambda function URLs。
ついにAPI GatewayやALBを介さずにLambdaが直接HTTPサーバの機能を持ったので、お手軽に利用する幅が拡がることだろう。
今回は、実際どれだけお手軽になったか、どんなことが制約になり得るかを実際に構築しながら考察をしてみたい。

なお、事前知識としては以下を想定している。

– TerraformでLambda Functionを作成した経験がある
– Lambda Permissionsに関する知識が多少ある

Lambda関数の実装にはGolangを使っているが、基本的なことしかやっていないためそれほど重要ではない。

# 構成図
今回は以下の構成で作成をする。

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/0d20ee3b-7998-c96d-05cf-a48660a19370.png)

– ServerとProxyのLambdaそれぞれにfunction URLsを設定する

元記事を表示

【Go】forループのrangeで要素を更新したいとき、2つ目の変数は使えない

# 概要

`range` が返す変数の仕様で躓いたので、備忘録として残しておきます。
(下記でいう`k`, `v`)

“`go
package main

import “fmt”

func main() {
foo := map[string]string{“key”: “value”}
for k, v := range foo {
fmt.Printf(“foo[%v]: %v”, k, v)
}
}

// => foo[key]: value

“`

# 詳細

## 結論

`range` を使うときは以下の方針で書くのがいいと思います。

– 要素を値を更新したい ⇒ 1つ目の変数を使う
– 要素を更新したくない ⇒ 2つ目の変数を使う

理由は、

– 1つ目の変数は配列, mapのindex, keyであり、この値を使えばループしている配列, mapの要素の実体を指定できる
– 2つ目の変数は1つ目の変数で返されたindex, keyで示される値の**コピー**である(値渡しである)

というGoの仕様があるからです。つまり、2つ目の引数に再代入

元記事を表示

OTHERカテゴリの最新記事