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

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

【#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 main

import “

元記事を表示

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 main

import (
“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 main

import (
“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
}
“`

以上

元記事を表示

Goでスクレイピング

# はじめに
Dockerの環境構築からGo言語でスクレイピングする手順を整理しました。

# Go言語について
https://go.dev/

– Googleで開発されたプログラミング言語
– 文法がシンプルで大人数開発に向いている
– 処理速度が早い
– 並行処理が得意

# 本編
## ディレクトリ構成
ディレクトリ構成は下記のようになります。
“`
.
├── cmd
│ └── main.go
│ └── colly.go
│ └── dohouse_news.go
│ └── go.mod
│ └── go.sum
├── docker-compose.yml
├── Dockerfile.yml
“`

# Docker
Goを実行する環境をDockerで構築していきます。
### Dockerfile
“`dockerfile:Dockerfile
# image取得
FROM golang:1.19.0-alpine3.16

# ホストのファイルをコンテナの作業ディレクトリにコピー
COPY . /go/src/app

# ワーキングディレクトリの設定

元記事を表示

【Golang】SQLite3 でテーブル名一覧と DB の総レコード数を取得する

> Go 言語(以下 Golang)の [database/sql 標準パッケージ](https://pkg.go.dev/database/sql)で SQLite3 で DB を作成したものの、動的に作成されたテーブルのため、**作成されたテーブル名の一覧を取得する必要がある**。しかも、何件登録されているか、**DB 内の総レコード数を後からでも確認する方法**がないものか。
>
> Go 1.18 以降、[ドライバーは、もちろん天下の mattn さんの “go-sqlite3″](https://github.com/mattn/go-sqlite3)。

[「”golang” “sqlite3” テーブル名 一覧 取得」でググって](https://www.google.com/search?q=%22golang%22+%22sqlite3%22+%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E5%90%8D+%E4%B8%80%E8%A6%A7+%E5%8F%96%E5%BE%97)も、SQLite コマンドの `.table` で確認する方

元記事を表示

GoのAPIGatewayでslackのslashコマンド発行時にリクエストを検証するサンプル

## 説明
– Bodyの中の`token`を使うこともできるが、非推奨とされている
– HMACを利用して自身のSlackから送信していることを検証できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/59702e7c-a77b-3dc2-5a1f-8ce7feb8f40e.png)

## イメージ
1. `v0::`の文字列に対して、`Signin Secret`で復号する
1. 1の値を`X-Slack-Signature`を比較して一致しなければ、リクエストから落とす

## サンプル

“`go
func CheckSlackSignature(request events.APIGatewayProxyRequest) error {
slackVersion := “v0:”
slackTimestamp := request.Headers[“X-Slack-Request-T

元記事を表示

GitHub ActionsでSecretsから取得した情報をgo:embedで読み込む

# go:embedを使用したファイルの埋め込み

Go言語で外部ファイルを読み込むとき、go:embedディレクティブを使うと実行バイナリにファイルを埋め込むことができます。
変数の前に“`//go:embed ファイル名“`のように書きます。

## コード
“`go:main.go
package main

import (
_ “embed”
“fmt”
)

//go:embed secret.pem
var secretKey []byte

func main() {
fmt.Printf(“埋め込んだファイルの中身\n%s\n”, secretKey)
}
“`

“`secret.pem
—–BEGIN PRIVATE KEY—–
FOOBAR0123456789foobar0123456789FOOBAR0123456789foobar0123456789
FOOBAR0123456789foobar0123456789FOOBAR0123456789foobar0123456789
—–END PRIVATE KEY—–

元記事を表示

【#50 エンジニア転職学習】WSL2でUbuntu20.04のGo開発環境をつくる

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

3回連続になりますが、Linuxの開発環境を整えようと思います。

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

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

# 本日の学習内容
* **WSL2を使用してUbuntu20.04の開発環境構築 ←Topics!!**

# WSL2を使用してUbuntu20.04の開発環境構築
先日の投稿でVirtualBox上にUbuntu22.04を導入しました。
https://qiita.com/Chika110/items/9bc531bc3ed83784eae3

問題なく動いているように感じたのですが、全く負荷のかかる作業をしていない状態でも、
**ゲスト・ホストどちらともYouTube等の再生ができませんでした。
他にもBluetooth機器の接続がおかしくなるといった不具合も**でました

元記事を表示

ginの基本

# はじめに

goのWebアプリケーションフレームワークを触りながらメモしてみた。網羅的に学びたい場合は公式の[ドキュメント](https://github.com/gin-gonic/gin#gin-web-framework)をみた方が良いと思います。

# 準備

goをインストールする。windowsやmacだったら[公式サイト](https://go.dev/)からインストーラをダウンロードして実行、インストーラの指示に従っていけば特に迷うことなくセットアップできるはず。

エディタは[Visual Studio Code](https://code.visualstudio.com/)がオススメだけれど、好みに応じて選択すれば良いのではないかと思う。

続いて、開発用のフォルダを準備する。まず適当にフォルダを準備する。

“`bash
mkdir GinStudy
“`

そして初期化。

“`bash
cd GinStudy
go mod init GinStudy
“`

以降、全てこのフォルダ配下で作業する。

# とりあえず空っぽのサーバ

公式の[q

元記事を表示

OTHERカテゴリの最新記事