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

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

Goでリリースビルドするときに最低限付けておきたいオプション

みなさん、Goでビルドするときには、どんなオプションを指定していますか?

Goでは`go build`だけでも何事もなくビルドできるので、特に何も指定していないという人もいるかと思います。
しかし、オプションを何も指定せずにビルドした実行ファイルには、デバッグ情報などのリリース時には不要な様々な情報が含まれています。

本稿ではリリースビルドを作成するときに最低限付けておきたいオプションについて、簡単に紹介したいと思います。

※ビルドオプションを網羅的に紹介する記事ではありません。

## リリースビルド時に最低限付けたいオプション

Goでリリースビルドを作成する時に最低限付けておきたいオプションは次の2つです。

– `-ldflags=”-s -w”`
– デバッグ情報(シンボルテーブル等)を含めないオプション
– ファイルサイズが小さくなります
– `-trimpath`
– ビルド環境のローカルパス情報を取り除くオプション
– (ユーザー名などが含まれた)ローカルPC上のパス情報の漏洩を防げます

実際にはこのような感じで使います。

“`sh
go b

元記事を表示

速度改善のためRailsコードをGoで書き直して、FFIを使ってみた

railsのコードをgolangに書き直したら、10倍早くなりました
===================================

ffiでgoを呼び出すようにすると早くなるという記事を見たので、

実際に使用してみたら、本当に10倍ほど早くなりました。

## ディレクトリ構成
今回はrailsなのでlib配下にffiディレクトリを用意して、その中にソースコードをおきました。

+ /app
+ /models
+ test.rb
+ /lib
+ /ffi
+ sample.rb
+ .directory-list.md
+ /src
+ sample.go
+ /model
+ data.go
+ /bin
+ sample.so

## 事前準備

ffiのgemを入れておく
“`
gem install ffi
“`

go.mod ファイル作

元記事を表示

ROT13をHaskell,Go,Rustで実装する

## 概要
腕試しにHaskellでROT13を実装してみた。
(GoとRustは以前に書いたものでこの記事としてはおまけです)

次の点を意識しています。

* 論理的に理解しやすいことが優先で、処理をまとめすぎない
* 数学的な思考を優先する (`$` を使って写像の合成を意識するぐらいですが)

## 指針

大まかに次の指針がある。

1. ローテーションの境界で場合分けする
a-m, n-z, A-M, N-Z で場合分けする(`mod`は使わない)
2. mod を使う
a-z, A-Z で場合分けし、ローテーションは `mod` を使って計算する
3. ROT13 の変換テーブルを用意する

今回は、1つ目のが多分一番理解しやすく、2つ目が自然な定式化で簡潔、3つ目がHaskell心をくすぐる書き方ができる…といった感じです。

## 解1: ローテーションの境界で場合分けする

a-m/n-z と A-M/N-Z で符号が変わるという知識をもとに実装する。
a-m, A-M の場合は 13 後ろにずらす。n-z, N-Z は前にずらす。

“`haskel

元記事を表示

インターン参加日記

DMMが開催する短期インターンに参加したので、その内容、感じたことを書こうと思います。

結論から言うと、最高でした!めっちゃGoの理解が深まりました笑

※ インターン内容公開の許可はいただいております。

## インターン概要
– 日数:5日間

– 実装方法:フルリモート

– 行ったこと:Goの学習、他のインターン生や社員の方々との交流

## スケジュール
1日目:オープニング、Go講義、社員雑談

2日目:Go講義

3日目、4日目:Go講義、演習

5日目:Go演習、解説、クロージング、LT会

### 1日目:オープニング、Go講義、社員雑談
前半では、会社説明やインターンの説明といったガイダンスや、インターン生の交流が行われました。

DMMは**理念が無く**、それ故あらゆる領域に踏み込めること、幅広い技術に触れることができる

元記事を表示

goplsやgoimportsでimport補完がバージョンを認識しないのを直す

## 問題

“`go:go.mod
module github.com/k0kubun/test

go 1.19

require (
github.com/k0kubun/pp/v3 v3.1.0
)
“`

“`go:main.go
package main

func main() {
pp.Println(1)
}
“`

が置いてあるリポジトリで `goimports main.go` すると、`import “github.com/k0kubun/pp/v3″` が補完されてほしいのに `import “github.com/k0kubun/pp”` が補完されてしまうことがある。

## 対処法
`”${GOPATH}/pkg/mod/github.com/k0kubun/pp@v3.0.1+incompatible”` など、go.mod非互換のバージョンが残っていると再現する。なので `”${GOPATH}/pkg/mod/github.com/k0kubun”` を丸ごと削除したあと以下をやり直したりすると良い。

“`
go mod dow

元記事を表示

【Go】reflectを使用した型判定で`reflect.Type`に無いものも使用したい

## 概要
あまり使うことは多くないと思いますが、例えばStructのフィールドを動的に取得する等の際に、reflectパッケージを利用します。reflectの概要等は、[reflectで動的に型を判定](https://www.wakuwakubank.com/posts/795-go-reflect/)の記事にまとめられています。
上記で紹介した記事では`reflect.Type`を使用して型の判定を行なっていますが、例えば`time.Time`型など`reflect.Type`に用意されていない型が含まれる時にどうするか。対応方法をメモ書きします。

## 対応
[Go type switch with time.Time](https://stackoverflow.com/questions/47739395/go-type-switch-with-time-time)のstackoverflowの記事にいくつか対応方法が紹介されています。
個人的には一度`Interface`型でreflectのvalueを取得した後に、型の判定をする方法が良いかなと感じました。

## 実

元記事を表示

GORMで動的なSQLの実行や検索のやり方

# やり方
GORMで動的なSQLの実行や検索を行いたい場合は、以下のようにGORMのSQLメソッドのDBインスタンスを受け取って、そのインスタンスでSQLを実行する必要があります。
“`go
db, err := gorm.Open(sqlite.Open(“test.db”), &gorm.Config{})
db = db.Table(“test_table”).Select(“*”)

// 動的に実行したいSQL
db = db.Where(“検索条件”)

// SQLの実行
rows, err := db.Rows()
“`

# 例
例えば`test.db`に以下の`user`というテーブルがあったとします。
|id |name |
|—|—|
|1 |たかし |

`user`テーブルのたかしの情報を検索したい場合、以下の様なコードを実行すれば、情報の取得ができます。
“`go
type User struct {
Id int
Name string
}

func main(){
db, err := gorm.Open(sqlit

元記事を表示

【#47 エンジニア転職学習】GinTutorialのWebApp改造 キーワード検索機能追加

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

GoのフレームワークであるGinを中心に、
webアプリ開発学習をしていきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。

https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
GinのTutorialで作成したAPIを改造して、簡素なWebアプリを作成しようと思います

* **GinとGORMを使用したAPIにキーワード検索機能追加 ←Topics!!**

# GinとGORMを使用したAPIにキーワード検索機能追加
先日投稿したコチラの記事で作成した簡素なアプリに(https://qiita.com/Chika110/items/a6decf1f5c49001a6ca3)、
キーワード検索機能を追加しました。

前回から変更点したファイルのみ記述します。
追加した検索機能でできるようになったことは、以下になります

元記事を表示

バックエンド開発 Goのインストールと初期設定

## はじめに
バックエンドの環境構築で
Visual Studio CodeでGoを使用するために行ったことについてまとめます。

## 記事を書いてる人の前提条件
・[自己紹介](https://qiita.com/bear05/items/9bc49f01def7305fa075)

## 仕様技術、環境
OS → Windows 
エディター → Visual Studio Code

## Goとは
Googleが開発したサーバーサイド用のプログラミング言語。
C言語やC++に似ている言語。

参考記事↓
・[Goのエキスパートが教えるGoの魅力、プログラミング基礎入門](https://flxy.jp/media/article/10744)

## 環境構築
実施したこと
1. Goのインストール
1. Visual Studio CodeでGoを使用できるようにする

参考記事
・[Go 開発用に Visual Studio Code を構成する](https://docs.microsoft.com/ja-jp/azure/developer/go/configure

元記事を表示

Goのポインタに関して図を用いて説明する

## 初めに
Goのポインタを理解するのに苦戦したため、基本的な内容を自分なりにかみ砕いて投稿する。

■ 実行環境
[The Go Playground](https://go.dev/play/)
■ GOのバージョン
1.18

## 前提情報の整理
### 用語
– メインメモリ(主記憶装置)・・・コンピュータのデータ記憶領域。
– メモリアドレス・・・各メモリに割り振られるメモリのアドレス。
– ポインタ(ポインタ変数)・・・メモリアドレスとその領域の型を格納する変数。
– ポインタ型・・・ポインタの型。(Int型へのポインタ型、string型へのポイント型など)

※ポインタとポインタ変数に関しては、記事によって表現にブレがあるため、必ずしも今回の定義であるとは限らない。

### ポインタは何を実現するものか
メモリアドレスを使用して、メモリにアクセスする手段である。
### なぜポインタに型が必要なのか
型によって必要なバイト数が異なるため。

### 変数とメモリ
コンピュータは、変数が定義された際にメインメモリに変数を格納する。
※本来データ型によって使用する

元記事を表示

Go 基本的な文法のアウトプット(変数、関数、For・Switch文、Defer)

## 初めに
[Goの公式チュートリアル](https://go-tour-jp.appspot.com/welcome/1)を使用して勉強した内容をアウトプットするため記事を投稿する。

## パッケージ

### 記述の初め方

Goでは、mainパッケージから開始する。
“`go
package main
“`

### パッケージのインポート

##### 記述方法1
“`go
import{
“パッケージ1”
“パッケージ2”
}
“`
##### 記述方法2
“`go
import “パッケージ1”
import “パッケージ2”
“`
記述方法1のほうがコンパクトで分かりやすい。

### エクスポート
最初の文字が大文字だと、エクスポートされて外部パッケージからアクセスすることができる。
小文字だと、外部パッケージからアクセスすることができない。

##### 基本的な書き方
mainパッケージを導入し、main関数内に処理を記載する。
“`go
package main

func main() {

}
“`
## 関数

##### 基本的な

元記事を表示

はじめてのGo

# まずはGoのInstallから

とりあえずGinというフレームワークでREST APIを作る想定で学習してみよう。

# 目次

1. [GoのInstall](#Chapter1)
1. [GinのInstall](#Chapter2)
1. [コードを書く](#Chapter3)
1. [APIを実行してみよう](#Chapter4)



# GoのInstall
MacならbrewでInstall可能
“`
taka$ brew install go
“`

ちゃんとInstall出来たか確認しよう
“`
taka$ go version
go version go1.18.5 darwin/amd64
“`

パスの設定がうまくいっているか確認しよう
“`
taka$ go env GOROOT
/usr/local/Cellar/go/1.18.5/libexec

taka$ go env GOPATH
/

元記事を表示

Go Echo でミドルウェアを入れようとした時のつまずき

## 1. Echo で 以下のようにミドルウェアを設定

“`go
func main() {
e := echo.New()

// ミドルウェア
e.Use(middleware.Recover())
e.Use(middleware.Logger())
“`

## 2. jwt-go が必要と言われたので入れた
“`
echo-test-app-1 | ../pkg/mod/github.com/labstack/echo@v3.3.10+incompatible/middleware/jwt.go:9:2: no required module provides package github.com/dgrijalva/jwt-go; to add it:
echo-test-app-1 | go get github.com/dgrijalva/jwt-go
echo-test-app-1 exited with code 1
“`

“`
go get github.com/dgrijalva/jwt-go
“`

## 3. Midd

元記事を表示

Raspberry-Py ロボットカー製作Go学習

### 2020 64歳の誕生日にスキルアップ電子工作始ました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/bac97163-ee47-4d73-528d-f13c86dab167.png)
### メーカーサイト資料

Visit our online store to purchase this product ☛ http://freenove.com/store
Download tutorial and code for this kit ☛ http://freenove.com/fnk0043

### Go学習も進めながらAIも進めました 
https://www.udemy.com/course/python-drone/

https://www.udemy.com/course/go-drone/

![image.png](https://qiita-imag

元記事を表示

「A Tour of Go」 の Exercise: Fibonacci closure を解きました

引き続き、Goの公式のチュートリアル「[A Tour of Go](https://go-tour-jp.appspot.com/list)」を読み進めています。当記事は、関数の一種「クロージャー」に関する練習問題「[Exercise: Fibonacci closure](https://go-tour-jp.appspot.com/moretypes/26)」を解いた記録です。

# コード

“`go
package main

import “fmt”

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
first := 0
second := 1
result := 0
return func() int {
result += first
first = second
second = result
return result
}
}

func main() {
f := fibona

元記事を表示

GolangのホットリロードはAirを使おう

# はじめに
Go言語で開発時にライブリロード機能がないと毎回コンテナを落としてあげてが面倒だった。調べてみるとAirを導入するとライブリロードが使えるみたいなのでその導入方法をメモとして残しておきます。
“`Dockerfile
FROM golang:1.18-alpine

RUN apk update && apk add git
RUN go install github.com/cosmtrek/air@v1.29.0
WORKDIR /app

CMD [“air”, “-c”, “.air.toml”]
“`
上記の`.air.toml`は[公式のもの](https://github.com/cosmtrek/air/blob/master/air_example.toml)を一旦そのまま持ってきています。カスタマイズしたい方は色々カスタマイズして見てください。

続いて`docker-compose.yml`は以下のように記述します。
“`yaml
version: ‘3.8’
services:
server:
build:
cont

元記事を表示

Goのdeferがよくわかならなかったので写経した

# はじめに
Go言語を最近少しずつ触っている中で`defer`が出てきたのですが、調べただけでは動きがわかりづらかったので触ってみることにしました。この記事は触った記録をメモしたものです。

“`shell
$ go version
go version go1.18.4 darwin/arm64
“`

# deferとは
deferはreturnされるまで実行されない書き方です。
例として以下のコードを考えます。
“`go
package main

import “fmt”

func main() {
defer func() {
fmt.Println(“defer”)
}()
for i := 0; i < 10; i++ { fmt.Println(i) } } ``` 上記のように書いた場合、defer内の`fmt.Println("defer")`はfor文の後に実行されます。 ```shell $ go run main.go 0

元記事を表示

【#45 エンジニア転職学習】GinTutorialのWebApp改造 GetPostFormについて

Fomr# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

GoのフレームワークであるGinを中心に、
webアプリ開発学習をしていきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。

https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
GinのTutorialで作成したAPIを改造して、簡素なWebアプリを作成しようと思います。
昨日POSTできなかった原因が分かりましたので、その内容をまとめます。

* **GinのGetPostFormについて ←Topics!!**

# GinのGetPostFormについて
昨日投稿したコード
https://qiita.com/Chika110/items/e65f1cddac4fe6976ee6
のPOSTやPUT実行時、こちら側で設定したカラムのレコード値がMySQL側に渡っていませんでした。
結論から言うと、`gin.

元記事を表示

React(Next)×TypeScript×Goを学習したコンテンツまとめ (随時更新)

# はじめに

仕事の関係でReactとTypeScriptをする必要がでたのですが、社内に知見のある方がいなかったため自分である程度学習する必要がありました。

また、今後社内に普及していく中でどのような学習手順を踏んでいけば効率よく学習ができるようになるかも含めてまとめていきます。

2022年8月時点で評判や内容などを加味して学習するコンテンツを選んでいます。また紹介順序は学習順序に合わせています

# TypeScript

## TypeScriptハンズオン

https://www.amazon.co.jp/TypeScript%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83-ebook/dp/B09D76MB7B/ref=sr_1_9?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2X58BGUF89WZ9&keywords=typescript&qid=1659312039&s

元記事を表示

【Go】Go ver1.18 からジェネリクスが使えるようになった【ジェネリクス】

## はじめに
2022年3月なので、既に数ヶ月以上前の話にはなりますが…
Go のver1.18がリリースされ、新機能としてジェネリクスが使えるようになりました。
現在私が仕事で触っているのはver1.16なのでジェネリクスの恩恵を受けていないのですが
どうやらものすごく便利な機能らしいので少し触ってみようかなと思います。

#### 編集履歴
**2022.08.02**
・ver1.18以前、interface{}の弊害としてのpanicに関する記述を追加
・「ジェネリクスが追加されて個人的に嬉しくなったこと(補足)」を追加
・参考リンク追加

## ジェネリクスとは??
>ジェネリック(総称あるいは汎用)プログラミング(英: generic programming)は、具体的なデータ型に直接依存しない、抽象的かつ汎用的なコード記述を可能にするコンピュータプログラミング手法である。 wikipediaより

~~ちょっと何言ってるか分からない。~~

静的型付け言語ではお馴染みの機能らしいが、ver1.18以前のGoにはなかった機能。
超ざっくり言うと、関数とかで汎用的に(gen

元記事を表示

OTHERカテゴリの最新記事