- 1. Go言語~リフレクション活用事例~
- 2. aws-sdk-goでDynamoDBを取り扱うサンプル
- 3. Goでレイアウトを読み込んでいるが白いページになる
- 4. go.modを使わずに自作パッケージを読み込む
- 5. goのパッケージインストールでgetとinstallがあるがどう違うか
- 6. VSCodeのRemoteContainerのGo拡張機能に必要なライブラリをインストールする
- 7. MySQLでsql: Scan error on column index 1, name “created_at”: unsupported Scan, storing driver.Value type []uint8 into type *time.Time
- 8. VSCodeのGoの拡張機能でエラーがでる (DockerでGoをやるうえでの注意)
- 9. DockerでGoのパッケージが読み込めない(自作パッケージが読み込めない)
- 10. actions/setup-go@v3にキャッシュ機能が実装されたのでGithub Actionsの設定を書き替える
- 11. 【Golang】文字列と数値の変換(strconv)
- 12. Goの配列とSliceに関してのアウトプット
- 13. Go modules環境で同一module内の他ファイルを読み込む
- 14. 【#54 エンジニア転職学習】GORMでテーブルリセット/goqueryをループ処理
- 15. Goでレコードを追加する際にincorrect string value
- 16. Goのdatabase/sqlパッケージとGORMのコードリーディング
- 17. 【#53 エンジニア転職学習】goqueryでスクレイピングした情報をDBに一括保存する
- 18. 【#52 エンジニア転職学習】goqueryでhref情報をスクレイピング
- 19. 【Golang】基礎中の基礎の文法
- 20. GoのError()とString()の優先順位
Go言語~リフレクション活用事例~
こんちには!
LIFULLエンジニアの吉永です。本日は私の普段の業務でメイン言語として利用しているGo言語のリフレクションを活用した実装事例を紹介したいと思います。
※[Go 強化月間](https://qiita.com/official-events/ae80b010f51f7018891a)を開催中らしいので、ビッグウェーブに載ってみました!リフレクションは結構取り扱いが難しく、自分もあまり積極的に過去の実装で採用したことはなかったので、どんな場面で使う?のイメージが曖昧でした。
この記事では私と同じように、リフレクションの存在は知ってるけど、具体的にどんな場面で使うの?っていう一つの事例として参考になれば幸いです。
## リフレクションとは?
リフレクション自体はGo言語特有の機能ではなく、現在一般的に利用されているプログラミング言語ではほぼ対応している機能となります。
https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%95%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3_(%E
aws-sdk-goでDynamoDBを取り扱うサンプル
## テーブルのセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/74ed0553-eae6-f118-79eb-cc2b853ec6cc.png)この3つの項目で構成する
– userid number
– priolity number
– description string## PUT
“`go
package mainimport (
“fmt”“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/dynamodb”
)func main() {
ddb := dynamodb.New(session.New(), aws.NewConfig().WithRegion(“ap-northeast-1”))param1 := &dynamodb.PutIte
Goでレイアウトを読み込んでいるが白いページになる
# はじめに
この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください# 問題
Udemyの講座でGoのレイアウトを読み込む設定をしていたがなぜか読み込めなかった
コードは正しそうだった# 解決方法
これはコードコピーでゼロ幅スペースが入っていることが原因だった
VSCodeの拡張機能`Gremlins tracker for Visual Studio Code`をいれるとゼロ幅スペースが視覚的にわかりやすくなり、消したところ問題なく動くようになった
go.modを使わずに自作パッケージを読み込む
# はじめに
この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください# 問題
`go.mod`を利用することで自作したパッケージを読み込むことができていた
“`
import go-pkg/sample
“`これを
“`
import sample
“`のようにインポートしたかった
# 解決方法
Dockerfileに以下の環境変数を追加したら読み込むことができた
“`Dockerfile
ENV GO111MODULE off
“`そしてGOPATH/srcいかのパスを指定した
それと地味にはまったのが
`/go/src/app/hello`の場合`import app/hello`と指定することだった# 参考
https://teratail.com/questions/375192
goのパッケージインストールでgetとinstallがあるがどう違うか
# はじめに
この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください# 問題
Goには`go get`を使ってインストールするものと`go install`を使っていインストールするものがあったり、
`go get`はなるべく`go install`に変えたほうがいいという記事をみかけたりよくわからなかった# わかったこと
自分で調べた感じでは以下の認識
間違っている場合は教えていただきたいです`get`でいれると`$GOPATH/pkg/mod/`にパッケージが入り
`install`なら`/go/.bin`にはいる
`go get`は`go.mod`が必要になるairのように`air -c`で実行するものは`install`でいれる
またパッケージによっては`install`に対応していないここまでが初心者としての違いの認識でした
VSCodeのRemoteContainerのGo拡張機能に必要なライブラリをインストールする
# はじめに
この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください# 問題
VSCodeのRemoteContainerでGoコンテナの中に入って拡張機能をインストールすると、`gopls`など依存するライブラリを入れる必要があり、推奨されたインストールを何回か実行してインストール待ちが発生してしまうので、コンテナに必要なものを入れておいて、RemoteContainerではGo拡張だけをインストールするようにしたかったです
# 解決方法
以下をDockerfileに加えた
“`Dockerfile:Dockerfile
RUN go install golang.org/x/tools/gopls@latest
RUN go install github.com/ramya-rao-a/go-outline@latest
RUN go mod tidy
“`
MySQLでsql: Scan error on column index 1, name “created_at”: unsupported Scan, storing driver.Value type []uint8 into type *time.Time
# はじめに
この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください# 問題
GoでMySQLを利用してレコード取得をしようとすると以下のエラーが発生しました
“`
sql: Scan error on column index 1, name “created_at”: unsupported Scan, storing driver.Value type []uint8 into type *time.Time
“`# 解決方法
DBの接続の語尾に`?parseTime=true`をつけたら成功しました
“`go:main.go
var connect = fmt.Sprintf(“%s:%s@%s/%s?parseTime=true”, “root”, “password”, “tcp(db:3306)”, “myapp”)
“`# 参考
https://budougumi0617.github.io/2019/03/31/go_d
VSCodeのGoの拡張機能でエラーがでる (DockerでGoをやるうえでの注意)
# はじめに
この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください# 問題
VSCode+WSL2+Docker+Goの環境でGOの拡張機能をいれたところ、起動時にVSCodeの左下に以下のエラーがでるようになりました
“`
failed to find the “go” binary in either goroot()….
“`# 解決方法
これはローカルにGOをインストールすることで解決できました
https://blog.nya-n.net/posts/post-1853/
https://qiita.com/sola-msr/items/93fbf9c988ee81a2f196
またインストールしたところ以下のエラーに変わりました
“`
the “gopls” command is not available. run “go install -v golang.org/x/tools/gopls@latest” to in
DockerでGoのパッケージが読み込めない(自作パッケージが読み込めない)
# はじめに
この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください# 問題
Goコンテナの中で自分で作成したパッケージ(関数)をインポートしようとして呼び出そうとしたがエラーになった
書籍では同じ方法でできているのでおかしい# 解決方法
`go.mod`を利用してパッケージを読み込みする必要があった
https://qiita.com/kazuma_M/items/75d522668d42247075f1
actions/setup-go@v3にキャッシュ機能が実装されたのでGithub Actionsの設定を書き替える
## 目次
– [はじめに](#はじめに)
– [これまで](#これまで)
– [これから](#これから)
– [おわりに](#おわりに)## はじめに
初めまして、Rasといいます。普段は[デジタル創作同好会traP](https://trap.jp)というところで活動しています。
https://trap.jp
Github ActionsでGoを使うときは[actions/setup-go](https://github.com/actions/setup-go)を使うのが一般的だと思います。
https://github.com/actions/setup-go
先日v3.2.0がリリースされ、キャッシュ機能が実装されました。Github Actionsのワークフローの記述がより簡潔になります。
https://github.com/actions/setup-go/releases/tag/v3.2.0
CIの実行時間が1分以上短縮できた話や移行でハマってしまった話をしています。良ければこちらもどうぞ (今日投稿されたばかりのピチピチ記事です:fish::
【Golang】文字列と数値の変換(strconv)
Goの勉強中にstring型の型変換で少し詰まったので、調べてわかったことを簡単に紹介します。
## strconv パッケージ
文字列を数値に変換したいときは、strconvパッケージを使用します。この記事では、文字列と数値の変換しか紹介していませんが、bool型との変換なども存在します。また、違ったやり方もあるので、もっと詳しく知りたい方は[公式ドキュメント(strconv)](https://pkg.go.dev/strconv@go1.19)を読んでみてください。## string <-> intの変換
– strconv.Atoi(s string): string型 -> int型
引数で指定された文字列を数値(int型)に変換して返します。
また、2番目の返り値としてerror型を返します。– strconv.Itoa(i int): int型 -> string型
引数で指定された数値(int型)を文字列に変換して返します。Atoi関数は、2番目の返り値としてerror型を返しますが、今回はエラー処理を省略するため使用しません。Atoi関数ではint型に変
Goの配列とSliceに関してのアウトプット
# 初めに
Goの配列とSliceに関してのアウトプットを行う。# 配列
Goの配列は固定長であり長さを変更することができない。
## 宣言
配列は以下のように宣言する。“`go
[要素数]型// 例
var i [2]int
“`
宣言した段階では、ゼロ値が格納されている。“`go
func main() {
var s [2]string
fmt.Println(s)
var i [2]int
fmt.Println(i)
}// 出力結果
[ ]
[0 0]
“`## 要素に値を格納
インデックス番号を指定して値を格納する方法は以下である。“`go
func main() {
var s [2]string
s[0] = “Go”
s[1] = “Study”
fmt.Println(s)
fmt.Println(s[0])
}// 出力結果
[Go Study]
Go
“`宣言と同時に値を格納する場合は以下である。
“`go
func main() {
s := [2]string{“Go”, “Study
Go modules環境で同一module内の他ファイルを読み込む
## 概要
Goで別ファイルの変数や関数を読み込む実装をしようとした際に苦戦したため備忘録として投稿する。
今回は`GOPATH`でなく`Go Modules`を使用する## 初期のファイル構成
### ツリー
“`
.
├── main.go
└── unify
├── const.go
└── func.go
“`### ファイル
`go_plactice`がモジュール名で`unify`が読み込み先のフォルダ名である。
`main関数`内で読み込んだ定数と関数を出力している。“`main.go
package mainimport (
“fmt”
“go_plactice/unify”
)
func main() {
fmt.Println(unify.Hoge);
fmt.Println(unify.Hello(“関数”));
}
“`“`const.go
package unifyconst Hoge = “定数”
“`“`func.go
package unifyfunc Hello(na
【#54 エンジニア転職学習】GORMでテーブルリセット/goqueryをループ処理
# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。引き続きスクレイピングのプロジェクトをつくっていきます。
バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。
https://qiita.com/Chika110/items/ef54dddd565a0193ef44
# 本日の学習内容
本日はMySQLのテーブルリセットとスクレイピングのループを追加しました。
* **DBテーブルのリセットとスクレイピングのループ処理追加 ←Topics!!**# DBテーブルのリセットとスクレイピングのループ処理追加
URL一覧のスクレイピングコードを調整しました。
**①スクレイピングの開始時に毎回DBテーブルをリセットする機能
②複数ページをスクレイピングできるようにループ処理**
の2点を追加しました。
ついでに`main.go`にまとめて書いていたスクレピング実行文を`scrape`パッケージに移動しました。①については、毎回リセットでいいので`g
Goでレコードを追加する際にincorrect string value
# はじめに
Goの開発を始めて今回DBでかなり時間を使ってしまったのでまとめます
またGoと書いてありますが根本的な原因はGoにはなかったのに早くに気づいてなかったので無駄に時間を取られました(それは検索してもみつからないわけだ)# 問題
Go(gorm)でレコードインサートをした際に以下のエラーが発生した
“`
incorrect string value
“`名前に日本語を利用していたためエラーが発生していることはわかっていたが`go mysql incorrect string value`としてもそれらしき記事がまったくヒットしなくて困っていた
# 解決方法
これはそもそもGoのエラーではなく`MySQL`のエラーなのでそちらの対応が必要になる
今回はDockerでMySQLのコンテナをたてていたので日本語(utf-8)を使えるようにするため色々調べた
まずイメージをMysql:5.7を利用していたので以下の`my.cnf`を作成
“`cnf:my.cnf
[mysqld]
character_set_server=utf8
character_
Goのdatabase/sqlパッケージとGORMのコードリーディング
## 今日やること
[database/sql](https://pkg.go.dev/database/sql)パッケージを素朴に使う。
その上で[GORM](https://gorm.io/ja_JP/docs/index.html)のコードを読む。## Version
– Mysql 8.X
– Go 1.18## database/sqlパッケージを使う。
### データベースとテーブル作成
“`sqlCREATE DATABASE example_go_sql;
CREATE TABLE users (
id SERIAL,
name VARCHAR(20)
);
“`### main.go
– 複数行取得 `func queryRows`
– 一行取得 `func queryRow`
– インサート `func create`
– トランザクションの使用(Update) `func txUpdate`を行います。
“`go
package mainimport (
“context”
“database/sql”
“fm
【#53 エンジニア転職学習】goqueryでスクレイピングした情報をDBに一括保存する
# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。引き続きスクレイピングのプロジェクトをつくっていきます。
バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。
https://qiita.com/Chika110/items/ef54dddd565a0193ef44
# 本日の学習内容
本日はスクレイピングしてきたURL一覧をDB保存する部分を作成しました。
* **goqueryでスクレイピングしたURL一覧をDBに一括保存する ←Topics!!**# goqueryでスクレイピングしたURL一覧をDBに一括保存する
昨日作成した、求人詳細へのリンクURL一覧を取得するコードに
MySQLへの一括保存をするコードを追加しました。一括でINSERTする方法は、結論から言うと「**gorm.CreateメソッドにDBモデルのstructを持つスライスを渡す**」方法になります。
動画ではバルクインサートという手法が紹介されており、
私もバルク
【#52 エンジニア転職学習】goqueryでhref情報をスクレイピング
# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。引き続きスクレイピングのプロジェクトをつくっていきます。
バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。
https://qiita.com/Chika110/items/ef54dddd565a0193ef44
# 本日の学習内容
本日は1つ目のタスクとしてURL一覧を取得するハンドラー部分を作成しました。
* **goqueryでURL一覧を取得するハンドラー作成 ←Topics!!**# goqueryでURL一覧を取得するハンドラー作成
対象である「マイナビ転職」の求人一覧ページ(https://tenshoku.mynavi.jp/list/)から、各求人詳細ページへのリンクURLを取得するところから始めます。
添付画像の`/jobinfo ~ /`をHTMLから取得してきます。
![image.png](https://qiita-image-store.s3.ap-northea
【Golang】基礎中の基礎の文法
備忘録として、Golangの基礎中の基礎の文法について綴っておこうと思います。
“`Go:基礎の文法
package main
import()
func main() {
//ここに処理内容を書く}
“`
GoのError()とString()の優先順位
:::note info
Go 1.18
:::Go初心者です。
A Tour Of Go
Stringer~Errorsをやっていた。https://go-tour-jp.appspot.com/methods/19> Goのプログラムは、エラーの状態を error 値で表現します。
error 型は fmt.Stringer に似た組み込みのインタフェースです:
>“`go
>type error interface {
> Error() string
>}
>“`
> ( fmt.Stringer と同様に、 fmt パッケージは、変数を文字列で出力する際に error インタフェースを確認します。 )つまり、fmt.Print(f)をしたときに、`f`のメソッド`String()`と、メソッド`Error()`を探しに行き、その文字列を(Printなら改行なしで)プリントする。
では、以下のように、String()とError()両方をもつインタフェースをfmtが呼び出したときにはどうなるか。“`go
package mainimport “