- 1. 【Golang】文字列と数値の変換(strconv)
- 2. Goの配列とSliceに関してのアウトプット
- 3. Go modules環境で同一module内の他ファイルを読み込む
- 4. 【#54 エンジニア転職学習】GORMでテーブルリセット/goqueryをループ処理
- 5. Goでレコードを追加する際にincorrect string value
- 6. Goのdatabase/sqlパッケージとGORMのコードリーディング
- 7. 【#53 エンジニア転職学習】goqueryでスクレイピングした情報をDBに一括保存する
- 8. 【#52 エンジニア転職学習】goqueryでhref情報をスクレイピング
- 9. 【Golang】基礎中の基礎の文法
- 10. GoのError()とString()の優先順位
- 11. go + Gin + クリーンアーキテクチャを用いたWebAPI構築
- 12. Goの構造体リテラルでフィールド名の指定を強制する
- 13. GORMのUpdateで構造体を使う場合「文字:””、数値:0、ブール:false」のフィールドが更新されない。
- 14. 【Go】AmazonPayの電子署名(signature)の実装サンプル
- 15. Go 1.19 で os/exec パッケージの挙動が変わった話【転載版】
- 16. Goの構造体に関してのアウトプット
- 17. Go で Stack と FIFO
- 18. gRPCでチャットを実装する(Go / React)
- 19. 【#51 エンジニア転職学習】goqueryを使用したスクレイピング
- 20. Golangでphpのarray_diff_assocをやる方法
【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 “
go + Gin + クリーンアーキテクチャを用いたWebAPI構築
## まずはじめに
今年からGoを学んでいるのですが、
バックエンドにGoを使用してWebサービスを作成することにしました。今回は作成したAPIサーバの一部の機能を、設計の観点からご紹介したいと思います。
ソースコードの全体や機能の詳細については[こちら](https://github.com/ryoh07/gin-clean-webapp)から。
## 開発環境
言語: Go
フレームワーク: Gin
ORM:XORM
DB:MySQL
ストレージ:AmazonS3## ディレクトリ構成
“`
server
├── common
│ ├── di
│ │ └── di.go
│ ├── dto
│ │ ├── photo.go
│ │ └── user.go
│ └── common.go
│
├── domain
│ ├── repository
│ │ ├── photo.go
│ │ └── user.go
| └── entity
│ ├── photo_factory.go
│
Goの構造体リテラルでフィールド名の指定を強制する
## はじめに
[Goにおける型によってSQLインジェクションを防ぐ方法](https://zenn.dev/tenntenn/articles/b452911b4200ff)という記事でsafesqlというライブラリで行っているGoの型をうまくつかってSQLインジェクションを防ぐ方法を解説しました。
この他にも型を使って何かを制限する方法ということで、本記事では構造体リテラルでフィールド指定を強制する方法について解説します。
## 構造体リテラル
構造体リテラルは、次のように構造体の値をリテラルで記述したものです。
“`go
T1{N: 100, S: “hoge”}
“`なお、型`T1`は次のように定義されているとします。
“`go
type T1 struct {
N int
S string
}
“`また、型`T1`の構造体リテラルは、次のようにフィールド名を省略して記述できます。
“`go
T1{100, “hoge”}
“`## フィールド名の省略
フィールド指定を省略した場合、うっかり間違った書き方をしてしまうと、気
GORMのUpdateで構造体を使う場合「文字:””、数値:0、ブール:false」のフィールドが更新されない。
既出だったのですが、情報が古かったので記事にしました。
# ハマりポイント
構造体で更新する場合、以下のフィールドが更新されない。
– 文字列:””
– 数値:0
– ブール値:false■更新されない例
以下は「Name, Age, Active」全て更新されない。“`golang
db.Model(&user).Updates(User{Name: “”, Age: 0, Active: false})
“`# どうすればいいか
2パターンあるようです。1) mapを使用して更新する:*map[string]interface{}{“name”: “hello”, “age”: 18, “active”: false}*
“`golang
// Select with Map
db.Model(&user).Updates(map[string]interface{}{“name”: “”, “age”: 0, “active”: false})
“`2) Select を使用して更新する:*Select(“Name
【Go】AmazonPayの電子署名(signature)の実装サンプル
Go強化月間らしいので、助かる人がいるか不明ですが、きっと将来の誰かの助けになるはず…?!
# 結論
AmazonPay、GoのSDK開発してくれ…!
すぐできるやろ?# AmazonPayのComplete Checkout Sessionの電子署名
このサンプルを良い感じに調整して、フロントのボタンのsignatureとか、Update Checkout Sessionのsignatureとか生成できるはずです電子署名の説明は書かないです。警察からコメントが来るので?
“`go
package mainimport (
“crypto”
“crypto/rand”
“crypto/rsa”
“crypto/sha256”
“crypto/x509”
“encoding/base64”
“encoding/json”
“encoding/pem”
“fmt”
“io/ioutil”
“net/http”
“strings”
“time”“github.com/pkg/errors”
)type AmazonPayGatew
Go 1.19 で os/exec パッケージの挙動が変わった話【転載版】
([Go強化月間](https://qiita.com/official-events/ae80b010f51f7018891a)と聞いたので(笑) この記事は[自ブログ](https://text.baldanders.info/golang/exec-package-in-go119/)からの転載です。書き捨てなのでメンテナンスしません。悪しからずご了承の程を)
[Go] 1.19 の[リリースノート](https://go.dev/doc/go1.19 “Go 1.19 Release Notes – The Go Programming Language”)を眺めてみると
> [`Command`](https://go.dev/pkg/os/exec/#Command) and [`LookPath`](https://go.dev/pkg/os/exec/#LookPath) no longer allow results from a PATH search to be found relative to the current directory. This re
Goの構造体に関してのアウトプット
## 初めに
Goの構造体を勉強したため、アウトプットのため記事を投稿する。■ 実行環境
[The Go Playground](https://go.dev/play/)
■ GOのバージョン
1.18## 概要
構造体とは・・・異なるデータ型を1つにしたもの
1つ1つのデータをフィールド呼ぶ。## 構造体の宣言
##### 基本形
“`go
type [構造体名] struct {
[フィールド名] [型]
}
“`##### 例
“`go
type Go struct {
X int
Y int
S string
}
“`フィールドの型が同じ場合は、カンマを使用して同じ列に記載可能である。
“`go
type Go struct {
X, Y int
S, T string
}
“`※構造体名の頭文字は小文字でも宣言できるが、その場合は外部のパッケージから参照することができないので、使用用途に合わせて変更する必要がある。
余談だが、Go言語の予約後に「go」という単語があるので、上記例にて頭文字を小文字で使用するとエラーにな
Go で Stack と FIFO
# はじめに
[Go 強化月間](https://qiita.com/official-events/ae80b010f51f7018891a) と聞いたので Go の記事を書きます。
Go で Stack や FIFO を実装する時には `container/list` を使います。この `container/list` は Stack と FIFO に必要となるベースのみ提供されます。なぜなら Stack も FIFO も仕組みは同じで、取り出す時に先頭か最後かの違いしかないからです。
# Stack
`container/list` をフィールドに持ち、末端に追加、末端から取り出すのが Stack ですね。
“`go
package mainimport (
“container/list”
“fmt”
)type Stack struct {
v *list.List
}func NewStack() *Stack {
return &Stack{v: list.New()}
}func (s *Stack) Push(v interfac
gRPCでチャットを実装する(Go / React)
# 概要
前回の記事 → [なるべく詳しく調べるgRPC入門??](https://qiita.com/kawamou/items/49176fa4035d485065c1)
gRPCについて学びましたが、何かしら手を動かしてアウトプットしたい気持ちになってきました。
諸々調べると、[gRPCのストリーミングな仕組みを活かしてチャットを作っている方](https://qiita.com/okmttdhr/items/a37563047904ac98f3ed)が何人かいらっしゃったので、自分も作ることにしました??実装にあたり、下記の技術を選定しました。
“`
フロントエンド – React(TypeScript)
バックエンド – Go
プロキシ – Envoy
“`ブラウザ上で動くReactとgRPCサーバ(Go)がやりとりすることでチャットを構成します。
ブラウザから直接gRPCを喋ることはできないので、gRPC-Webの仕組みに乗ってEnvoyプロキシ越しにバックエンドと通信します。# 成果物
実装したチャットのgifはコチラです。![chat2x.
【#51 エンジニア転職学習】goqueryを使用したスクレイピング
# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。本日よりスクレイピングのプロジェクトをつくっていきます。
バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。
https://qiita.com/Chika110/items/ef54dddd565a0193ef44
# 本日の学習内容
本日はプロジェクトのタスク決め、goqueryの操作をやってみました。
* **プロジェクトのタスク決め ←Topics!!**# スクレイピングプロジェクトのタスク決め
今回参考にするメイン教材は以下の動画です。
動画はLaravelとgoutteを使用していますが、**Go・goquery・GORM**に置き換えて作成していきたいと思います。### タスク
動
Golangでphpのarray_diff_assocをやる方法
## 下記の関数にarray_diff_assocしたいマップを渡せばOK!!
“`golang
//php array_diff_assoc replacement
func ArrayDiffAssoc(s1, s2 map[string]interface{}) map[string]interface{} {
r := make(map[string]interface{})
for k, v := range s1 {
if c, ok := s2[k]; !ok || c != v {
r[k] = v
}
}
return r
}
“`以上