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

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

[Karabiner-Elements] イコール (=) を長押ししたらコロンイコール (:=) と入力できるようにする

# 概要

Go を書いているときに、代入文で `Shift-;` + `=` と入力するのが少々面倒だったので、
`=` を長押ししたら `:=` と入力できるようにしました。

# Karabiner-Elements とは

https://karabiner-elements.pqrs.org/

# 設定

`~/.config/karabiner/karabiner.json` を開いて
`profiles > complex_modifications > rules` の中に下記ルールを追加してください。

“`json
{
“description”: “イコール(=)を長押ししたらコロンイコール(:=)に置換する”,
“manipulators”: [
{
“from”: {
“key_code”: “equal_sign”,
“modifiers”: {
“optional”: [
“ca

元記事を表示

【Golang】Structオリエンテッドまとめ

# 39 メソッドとポインタレシーバーと値レシーバー

### メソッド
#### 構造体の値を関数で使用する場合
“`go
package main

import “fmt”

type Ver struct {
X, Y int
}

func Area(v Ver) int {
return v.X * v.Y
}

func main() {
v := Ver{3, 4}
fmt.Println(Area(v))
}
“`

“`
12
“`

Area()と構造体Verに結びつきがない

### 値レシーバー
オブジェクト指向のクラスとメソッドのように、構造体のメソッドのような形が作れる

“`go
package main

import “fmt”

type Ver struct {
X, Y int
}

func (v Ver) Area() int {
return v.X * v.Y
}

func main() {
v := Ver{3, 4}
fmt.Println(v.Area())
}
“`

“`
12
“`

###

元記事を表示

【Golang】ポインタまとめ

# 34 ポインタ
“`go
package main

import “fmt”

func main() {
var v int = 10
fmt.Println(v)
fmt.Println(&v)

var p *int = &v
fmt.Println(p)
fmt.Println(*p)
}
“`

“`実行結果.go
10
0xc0000160c8
0xc0000160c8
10
“`

# 36 struct
“`go
package main

import “fmt”

type Vertex struct {
X, Y int
S string
}

func main() {
v := Vertex{X: 1, Y: 2, S: “ver”}
fmt.Println(v)

v4 := Vertex{}
fmt.Printf(“%T %v\n”, v, v4)

var v5 Vertex
fmt.Printf(“%T %v\n”, v5, v5)

// ポインタ
v6 := new(Vertex)
fmt.

元記事を表示

Goにおけるレシーバの型について

下記の様なコードがあるとします。

“`go

package main

import “fmt”

type Greet interface {
sayGreet() string
}

type Hello struct {
Message string
}

func (h *Hello) sayGreet() string {
return h.Message
}

func createGreet() Greet {
return Hello{Message: “こんにちは”}//ここでコンパイルエラー
}

func main() {
g := createGreet()
fmt.Println(g.sayGreet())
}

“`
今このコードは、createGreet関数のreturnの箇所でコンパイルエラーを起こしています。

なぜなのか。

createGreet関数の返り値はGreetインターフェイスです。

ということは

“`go
return Hello{Message: “こんにちは”}
“`
上記で返される返り値がGreetイン

元記事を表示

コマンドラインでAzure Functions Custom Handlerをデプロイする(Go / HTTP trigger編)

# はじめに

[Microsoft Azure](https://azure.microsoft.com/ja-jp/)のFaaSである[Azure Functions](https://azure.microsoft.com/ja-jp/services/functions/)において、GoやRustはネイティブにサポートされておらず、Custom Handlerという仕組みを使って実現されています。

– [Azure Functions のカスタム ハンドラー | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-custom-handlers)

また、[Visual Studio Code](https://code.visualstudio.com/)と[Azure Functions エクステンション](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azuref

元記事を表示

【Go, Mysql】 DBに指定したidがあればinsert, なければupdate を行う

# Go , MySql で 指定したidにレコードがなければinsert, あればupdateを行う

dockerのMySqlにplacesテーブルを作成後、初期データをinsertしたかったため、primary keyのidをauto incrementせずにidを指定してinsertを行うようにした。

しかし、下記の場合だと、再度実行する際にDBにレコードが入っており、primary keyが重複するというエラーが発生した。
“`go:db.go

func init(){
cmd := fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s(
id INT PRIMARY KEY,
name TEXT,
address TEXT)`, places)
Db.Exec(cmd)

insert_init_data()
}

func CreatePlace(id int, place string, address string) (err error) {
cmd := `insert into places(

元記事を表示

Docker-composeを使ってGoの実行環境の作成

# はじめに
Goを使ったプログラムを書きたかったのでコンテナを使い簡単に環境構築を行おうとしました。今回はホットリロード機能も付けた状態となります。備忘録としてまとめます。

# 構成
go
├ app
│ ├── go.mod
| ├── main.go
│ └── .air.toml
├ Dockerfile
└ docker-compose.yaml

# ファイルの作成
## Dockerfile
“`sh:Dockerfile
# goバージョン
FROM golang:1.17.9-alpine
# アップデートとgitのインストール
RUN apk add –update && apk add git
# appディレクトリの作成
RUN mkdir /go/src/app
# ワーキングディレクトリの設定
WORKDIR /go/src/app
# ホストのファイルをコンテナの作業ディレクトリに移行
ADD . /go/src/app
# ホットリロード用
RUN go install github.com/cosmtrek/air@v1.27.3

元記事を表示

Vue3 + leafletで格安薬局マップを作った件

[表示地域の格安薬局がひと目でわかるマップ](https://tobizaru.github.io/pharmacy_map/map/)を作成しました

![Screenshot_20220507_231416.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657882/c1e5001c-6a77-1107-07d6-0f57483cace3.png)

## 薬の価格はどこの薬局でも同じではないのか

実は薬の価格はどこの薬局でも同じ、ではありません。

詳しくは[こちら](https://pharmacyassistant.xyz/entry/yasui-yakkyoku-ranking/)などで調べていただければわかりますが、
簡単に言えば、国は下記のような薬局により多くの報酬が得られるよう法律を定めています。

– 実績として特定の病院ではなくいろいろな病院の処方箋を受け入れている薬局
– 大手でない小さな薬局、お客の少ない薬局
– ジェネリック医薬品をたくさん準備している薬局

この報酬は全

元記事を表示

go初学者の勉強用サイト

# goをこれから勉強したいあなたへ

この記事を見たあなたはナウでヤングなエンジニアに大人気のgoに興味があってこの記事の門を叩いたに違いありませんね.
goで開発を初めて1ヶ月の若輩者が、勉強の役に立ったもの(無料)をペタペタするので興味がある方はぜひ!
ちなみに、プログラミング未経験者には難しいのであまりオススメできません?

– [Go Playground](https://go.dev/play)
いますぐ “Hello world!!” してみたい方はこちら!
ブラウザですぐにgoのコードを試すことができます

– [とほほのGo言語入門](https://www.tohoho-web.com/ex/golang.html)
自分はこの記事をもとにAWSのCloud9に環境構築してUdemyの一番人気のやつで勉強しています。
環境構築に5分もかからなかったので激烈オススメです!
環境構築した後は、すぐに基礎を学びこともできます。

– [A Tour of Go](https://go-tour-jp.appspot.com/)
goの公式基礎学習サイトです。
ただ、基

元記事を表示

Go: GitLab API の使い方

トークンとプロジェクトID の設定

“`text:.env
PERSONAL_ACCESS_TOKEN=glpat-xxxxxx
PROJECT_ID=”35195199″
“`

## プロジェクトのメンバーの取得 ##

“`go:get_member.go
// —————————————————————
//
// get_members.go
//
// May/07/2022
// —————————————————————
package main

import (
“os”
“fmt”
“io/ioutil”
“net/http”
“encoding/json”
“github.com/joho/godotenv”
)

// —————————————————————
func main()

元記事を表示

Go言語 main.go 以外の関数がundefinedになる問題を解決

# Go言語のmain.go以外のファイルに定義した関数がdockerでundefined

go, mysqlコンテナを使用したアプリケーションで、以下のDockerfileの場合にエラーが起きた。

“`Dockerfile:Dockerfile
FROM golang:1.17.6-alpine
RUN apk update && apk add git
WORKDIR /go/src
CMD [“go”, “run”, “main.go”]
“`

docker-compose up したところ、 コンテナがexit していたため、ログを確認したところ、main.go以外のmianパッケージが読み込まれていないとのことだった.

スクリーンショット 2022-05-06 21.04.40.png

元記事を表示

2年目エンジニアのClean Architecture

この記事では、Clean Architectureの概要、構築をまとめています。

すでにこれらの内容を含んだ記事は多く存在していますが、私自身2年目に突入したことを機により理解を深めたいと思ったため、本記事を投稿するに至りました。

私ごとではありますが、今回初の投稿となりますので、過不足な点や分かりづらい点などがございましたら、ご指摘など頂けますと幸いです。

今回特に@hirotakanさんの[Clean ArchitectureでAPI Serverを構築してみる](https://qiita.com/hirotakan/items/698c1f5773a3cca6193e)を参考にさせて頂きました。
本記事は私が勉強がてら投稿したものになりますので、私のような初学者でこれから学習をしたい方には先述の記事をぜひオススメします。

# Clean Architectureの概要
![CleanArchitecture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2490180/f7277839-

元記事を表示

golangでパッケージを作成してmain.goから読み込んだらエラー

go言語を勉強中。
環境Windows10
VSCODE
go 1.17.7

プロジェクト名のディレクトリの下にmain.goを作成して
その下にmylibというディレクトリを作りました。
その中にgoファイルを作成して関数を作り。
main.goでその関数を呼び出そうとしたら以下のエラーなりました。
““
main.go:4:2: package projectname/mylib is not in GOROOT (C:\Program Files\Go\src\projectname\mylib)
““

この問題について以下の記事がありました。
[[GO言語]GOPATH以外の場所でのimportの挙動について整理](https://qiita.com/fetaro/items/31b02b940ce9ec579baf)

しかし、Go 1.16からGo-Moduleによるプロジェクト構成が推奨されたらしいという記事を発見しました。
“`
cd projectname
go mod init projectname
““

でモジュールを認識して実行するとこが

元記事を表示

【Golang】Goa✖️golang-migration✖️gorm でCRUD APIを実装する。

# まえがき
[前記事](https://qiita.com/crml1206/items/ccdf62e713e3c9599fd5)でGoaプロジェクトの環境構築を行なった。本記事ではgoaプロジェクトで[golang-migration](https://github.com/golang-migrate/migrate)と[gorm](https://github.com/go-gorm/gorm)を利用してCRUD APIを実装してみる。

 ① docker compose up でPostgreSQLコンテナ起動
 ② `golang-migration`でDBスキーマ作成
 ③ `gorm`でEntity作成・DB接続・CRUD処理実装
 ④ 動作確認

ソースだけ見たい人向け。

https://github.com/daisuketakakuwa/inventory-system

goaのGitHubにexampleプロジェクトがいくつかあるので、プロジェクト構成やコーディング等参考になるのでリンクを貼っておく。

https://github.com/goades

元記事を表示

可変長配列に要素を追加する処理の色々

# これは何?

go の slice や C++ の std::vector のようなものに要素を追加する場合に世の人々がどうするのかを調べた。

# そもそも

いわゆる可変長配列というものの代表的な実装は

* 適当にメモリ確保して、そこに要素を格納する
* 確保した容量に入らなくなったら、別の場所にメモリを確保して、そこに全部移動してから新要素を追加する

というものになっている。
この「別の場所にメモリを確保」の際にどうするのかが悩みどころ。
必要サイズぴったりにメモリ確保すると「1個追加」を1000回行った場合に絶望的に遅くなる。
多めに確保したいところだけど、多すぎるのはやっぱり損。

みんなどうしているのかなと思って調べてみた。

# 各実装

## go の slice

https://github.com/golang/go/blob/go1.18.1/src/runtime/slice.go#L193
辺りに実装がある。

1. 旧キャパシティが 256未満なら、新キャパシティは旧キャパシティの倍。
1. 旧キャパシティが 256以上なら、新キャパシティは旧キャ

元記事を表示

golang Enum?

Go のtypesパッケージでおもろい書き方があったのでメモ
“`golang
type BasicKind int

const (
Invalid BasicKind = iota // type is invalid

// predeclared types
Bool
Int
Int8
Int16
Int32
Int64
Uint
Uint8
Uint16
Uint32
Uint64
Uintptr
Float32
Float64
Complex64
Complex128
String
UnsafePointer

// types for untyped values
UntypedBool
UntypedInt
UntypedRune
UntypedFloat
UntypedComplex
UntypedString
UntypedNil

// aliases
Byte = Uint8
Rune = Int32
)
“`

元記事を表示

【競プロ】ScanningでTLEが発生してコケる

# はじめに
Go言語で競技プログラミングに臨んだことがある人なら, 一度は`fmt.Scan`関数の落とし穴にハマったことがあるのではないでしょうか. Go言語では標準入力を受け付ける際に, `fmt.Scan`関数, もしくは`bufio.Scanner`メソッドや`bufio.ReadLine`メソッドをよく用いります.
しかし, Go言語を使って競技プログラミングをやる場合, `bufio.Scanner`を使用しなければ困る場面があります.
今回の記事では, `fmt`パッケージの`Scan`関数と`bufio`パッケージの`Scanner`メソッドに注目しながら, `fmt.Scan`でTLEが発生する原因と解決策について紹介します.

[結論だけ知りたい人はこちらをクリック](#結論)

# fmt.Scan
まずは, `fmt.Scan`関数の詳細を見てみます.

## fmt.ScanでTLEが発生する
競プロにおいて, 大量のデータ入力が必要になる場合があります.
例えば, 競プロでよく見かける以下の入力形式において
“`
N
A1 A2 A3 … A

元記事を表示

Golangのappend()の実装とパフォーマンスについて

# この記事について

“`appned()“`の裏側の実装、またパフォーマンスについての調査です

## 目次
[1.はじめに](#はじめに)
[2.結論](#結論)
[3.実装について](#実装について)
[4.パフォーマンスについて](#パフォーマンスについて)
[5.まとめ](#まとめ)
[6.最後に](#最後に)

## はじめに
golangには“`append()“`という関数があります

“`golang
package main

import “fmt”

func main(){
x := []int{1,2,3}
fmt.Println(x) // x = [1,2,3]

x = append(x, 4)
fmt.Println(x) // x = [1,2,3,4]
}
“`

上記の例のように“`append()“`は
**スライスに要素を付け加える関数** です

しかしそんな都合よく **可変長配列** (実行時に長さが決定される配列) のようなものがあるのでしょうか……
(C言語を触りすぎて疑いの目?)

元記事を表示

[Go] ポインタを完全に理解した

# はじめに
この記事は、エンジニア経験1年の大学生が実務や個人の学習で勉強になったこと、詰まったことをまとめています。間違っている箇所などがございましたら、指摘していただけると幸いです。

# 背景
今まで恥ずかしながらポインタという概念を理解できていませんでした。なので、今回Goを新たに学習するにあたって、ポインタにつまずいたので、記事にして理解を深めようと思いました。

※自分なりに整理した記事であり、参考にならないかもしれないのでご了承下さい。

# 環境
– Go 1.18.1

# ポインタとは?
ポインタとは値のメモリアドレスを指す。

[参照](https://go-tour-jp.appspot.com/moretypes/1)

“`go
func main() {
var n int = 1

fmt.Println(n) // => 1
fmt.Println(&n) // => 0xc0000bc008
}
“`
Goでは変数に`&`を付けることで、その変数のメモリアドレスを取得できる。 なので、`0xc0000bc008`がメモリアドレスとなる。

元記事を表示

Goのインターフェイスの使い所を理解する。

以下のような、3種類の構造体があります。
それぞれ、自身の面積を返すAreaメソッドを持っています。

“`shape.go
package main

// 四角形
type Rectangle struct {
width float64
height float64
}

func (r Rectangle) Area() float64 {
return r.width * r.height
}

// 円
type Circle struct {
Radius float64
}

func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}

//三角形
type Triangle struct {
base float64
height float64
}

func (t Triangle) Area() float64 {
return (t.base * t.height) / 2
}

“`

それぞれの構造体のAreaメソッドをテストする関数を作成します

元記事を表示

OTHERカテゴリの最新記事