- 1. go言語で新しいプロジェクトを作る(go v1.18)
- 2. 【golang】DockerでGoの開発環境を構築する
- 3. Goのinterfaceにつまづいてしまったあなたへ
- 4. discordのwebhookを使用してgoから通知を送ってみた
- 5. ISUCONのGo利用割合
- 6. Goでスライスと配列の違いを知ったのでそれをまとめてみる
- 7. Golangにおけるポインタの必要性を理解したのでその解説
- 8. Azure Functions と Go 言語で Web API 開発
- 9. 【Golang】interfaceってなんだっけ?
- 10. Treasure2022参加記
- 11. draw.ioを操作するライブラリをGolangで書いてみた
- 12. Go言語ginを用いたモジュラモノリス構造について
- 13. Goでのスクレイピングに使っていたgoqueryをcollyに置き換えてみた
- 14. [Go] time.Time が encode & decode で元に戻らないので、time.Timeの中を調べてみた
- 15. 【Go/Gin】ちゃんとセッションを消すログアウト
- 16. Golangで多言語対応ライブラリのようなものを作ってみた
- 17. プログラミング経験者へのGo入門
- 18. 【MEMO】Goで文字コードを自動判別してCSVを読み込む/文字コードを指定して書き込む
- 19. [Go]並行処理・ゴルーチン
- 20. [Go]プログラミングノート
go言語で新しいプロジェクトを作る(go v1.18)
### プロジェクト作成とHello World
Go(v 1.18)で新しいプロジェクトを作るにはまずプロジェクト用に適当なフォルダをつくります。
たとえばwebappフォルダを作ります。私はubuntuを使っていますが、Windowsを使っている人はGUIからフォルダの作成をしてください。
“`
$ mkdir ./webapp
“`
そしたらまずはここがgoのプロジェクトのフォルダだと宣言します。
“`
$ cd ./webapp
$ go work init
“`
実際に作業をするのはモジュールのフォルダなのでモジュール用フォルダを作ります。
“`:webapp
$ mkdir ./helloworld
“`
ここでここがモジュールのフォルダだと宣言します。
“`:webapp
$ cd ./helloworld
$ go mod init example.com/webapp/helloworld
“`
なお、パッケージとして一般公開したい場合はモジュール名にちゃんと命名規則があるようです。
参考: https://go.dev/blog/package-na
【golang】DockerでGoの開発環境を構築する
Zennでも公開しています。
> [【golang】DockerでGoの開発環境を構築する](https://zenn.dev/yusuke49/articles/9ed37838861b1d)Goでボイラープレートを作っていくのですが、その際にDockerを利用して環境構築をしました。
## こんな方におすすめ
– Goで開発を進めていきたいけど極力自分のPC環境を汚したくない
– go module を利用する
– 一つのアプリ開発を通して、Go以外にもnodeやRDBなどの他の技術も必要になる## 前提
Dockerとdocker-composeが用意できている前提で進めていきます。
Macならターミナルで、WindowsならPowerShellで以下のコマンドを叩くと確認できます。
“`
$ docker –version
$ docker-compose –version
$ docker version
$ docker-compose version
“`# Docker
Do
Goのinterfaceにつまづいてしまったあなたへ
どうも ryo_grid です。
最近は自作RDBMSしています。皆さんもどうですか?
[自作RDBMSやろうぜ!](https://ryogrid.github.io/dbms-jisaku/)というのはさておき、自身はGoのinterfaceの挙動がしばらくよくわからなくてハマったのですが、そこらへんの簡潔な解説がGo公式サイトにも無いし、適当な技術記事も見当たらないなーと思ったので自分で書くことにしました。
細かいことを気にしなければ話は単純です。
なお、ハマりやすいところについてだけ解説するので、それ以前の知識は別途得てください。
# Goのinterfaceな型はそもそもポインタを格納する箱
– [Goのinterfaceをデータ構造から理解する – Zenn](https://zenn.dev/sivchari/articles/be6cc55d313b12#interface%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0)こちらの記事により詳しく書いてありますが、Goのinterfaceとして定
discordのwebhookを使用してgoから通知を送ってみた
無料版slackだとデータが消えていってしまうということでslackに飛ばしていた通知をdiscordに飛ばせないかと思い実装をしてみました!
参考文献: https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks
# 1. webhook_url取得
まずはここからですね。1. 通知したいチャンネルの設定を開きます
![スクリーンショット 2022-09-10 13.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/ec57608c-7b4d-c290-4c9c-1de2630dbce8.png)2. 連帯サービス > ウェブフックURLコピーをクリックして取得します
![スクリーンショット 2022-09-10 13.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/ba
ISUCONのGo利用割合
Goの紹介を書くために思い立ってグラフ化してみました。情報源はこちらです。
https://isucon.net/
2014ぐらいまでは、利用言語は自由記述と本文に書いてあったり、無記名のチームもあったようなので参考値です。2013では予選はGoで突破したけど本戦は別の言語で出たチームがあったみたい(2チーム突破で8%だったけど決勝は4%になってた)。
Goの開発効率と実行効率を証明する証拠として、JTBCで上司を説得するような場合に便利にご利用いただけるかと思
Goでスライスと配列の違いを知ったのでそれをまとめてみる
[前回の記事](https://qiita.com/wangqijiangjun/items/bac983a8d9f235d7cef0)でポインタの必要性を勉強しました。
まだ読んでない方がいらっしゃいましたら是非読んでやってください実務で`Go`を使ってく中で聞きなれないスライスという言葉を知って、それが何やら配列と関係性があるみたいなので今回はそれについて調べたので、今回はそれをまとめていこうとおもいます
今回の目次は以下の通りです
1. 配列とは
2. スライスとは
3. 配列とスライスの違い今回の記事はハンズオンでやっていくといいと思いますので、[こちら](https://go.dev/play/)のサイトから実際に手を動かしてみてください!
最後まで読んでいただけると幸いです!## 配列とは
`Go`における配列とはどんなものかというと、**同じデータタイプのデータを保存するためのもので、固定長のもの**です。
といってもよくわからないので詳しく見ていきましょう。### 配列の作り方
まず配列を作ってみましょう。
配列の作成の仕方は以下の2つの書き方がありま
Golangにおけるポインタの必要性を理解したのでその解説
今までRoRやPHPなどの動的型付言語をメインでやってきたんですが、今回行っているインターン先で、`Go`を使うことになったので、勉強しています。
そのなかで、初めて知った概念であるポインタについて今回は解説していこうと思います。
今回の記事を読んでわかることは以下の3つです。
* ポインタとはなんなのか
* ポインタの書き方
* ポインタってなぜ必要なのかこの2つがわかるようになると思いますので、最後までお付き合いお願いいたします。
なお、この記事では公式のPlayGroundからハンズオンでコピペではなく、手を動かしてみるのをお勧めします
https://go-tour-jp.appspot.com/welcome/4
## ポインタとは何なのか?
簡潔に言えば、ポインタとは**アドレス情報であるメモリにアクセスするためのもの**です。
メモリとは一時的にデータが保存されている場所でその中に変数が保存されています。メモリについては[こちらの記事](https://qiita.com/Sekky0905/items/447efa04a95e3fec217f#%E5%
Azure Functions と Go 言語で Web API 開発
# はじめに
この記事では、Go言語を使って、与えた二つの数値の和の結果を返すような Web API を作成します。GETリクエストを想定していて、二つの数値はクエリ文字列(URLパラメータ)で渡します。
デプロイ先としてはAzureのリソースを使います。よろしくお願いします。
【イベント】Go強化月間~開発する上で知っておくべき知見を共有しよう~
https://qiita.com/official-events/ae80b010f51f7018891a
# 環境
– Windows 11
– [Go 1.17.7](https://go.dev/dl/)# 必要なもの
– [Visual Studio Code](https://code.visualstudio.com/download)
– [Azure Functions用のVisual Studio Code 拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions)
– [
【Golang】interfaceってなんだっけ?
# はじめに
Zennに投稿されていた[『オレの書くGoは間違っていた』](https://zenn.dev/pranc1ngpegasus/articles/a8c92235bec641)という記事を読みました。
この記事で得た知見は「引数はinterfaceで受け入れて、戻り値は具体的な型(例えばstruct)で返却する」というのがGo流という話です。
せっかくの機会なので、「interfaceってなんだっけ?」と考えてみることにしました。
元記事に触発されて書き始めたものの、interfaceについてほんわか考える記事です。# そもそもinterfaceってなに?
– Goに限らず、(もっと言えばプログラミングに限らず)interfaceとは**抽象化の手段の一つ**だと思っています。もうちょっと簡単に言えば、**何かをふわっと捉えたい時に使うもの**です。[^1]
– 例えば「洗濯物を干す」という日本語を考えてみましょう。![sentakumono_niwa.png](https://qiita-image-store.s3.ap-northeast-1.amazona
Treasure2022参加記
# はじめに
久しぶりの投稿です。
8月の3週間を使ってCARTA HOLDINGS(旧Voyage Group)のサマーインターン「Treasure」に参加してきたので、今回はその中で開発したサービスの内容などを振り返っていこうと思います。実はここに書いてある以上に難所がたくさんあったのですがその辺はその部分の実装を担当した他のチームメンバーが参加記を書いてくれる…はず!
# 前提
– 開発期間は設計含め6日半(1日に使えるのは8時間。うち1時間は休憩)
– 使用技術は自由。AWSリソースも常識的な範囲で制限なく使える。
– 価値を創るプロダクトを作ること
– 社員サポーターの皆様が手厚くサポートに入ってくださる(基本的に「分からない」は言えば迅速かつ丁寧に拾ってもらえます。)人事のさとみんさんが書かれた[こちらの記事](https://techblog.cartaholdings.co.jp/entry/treasure2022-planning)だとイメージが掴みやすいと思います
# どんなサービス作ったの?
短時間の筋トレをしたい人をリアルタイムでマッチン
draw.ioを操作するライブラリをGolangで書いてみた
## 背景
+ 画面イメージをdraw.ioを作成し、仕様書に手で貼り付けるなど、面倒な作業があったので自動化したかった。
+ 自動化する中で、draw.ioを操作するライブラリを作る必要があった
+ Golangの実践の機会を増やしたかった
## 作ったもの
自動化まではまだ達成できていないが、draw.ioで使われるデータをいじれるようなライブラリを作った。
このライブラリを使うことで、draw.ioに自動で図形を挿入したり,draw.ioのライブラリを楽に作れるようになる。(使用例は別で記事を作成する予定)[Githubのリンクはこちら](https://github.com/capybara-alt/libdrawio)
“`golang:main.go
// drawioファイルをロードし、MxFile構造体にマッピング
mxfile, err := libdrawio.NewMxFile(“./mxfile_test_1.drawio”)
if err != nil {
t.Fail()
}// MxFile構造体のDiagramの値を
Go言語ginを用いたモジュラモノリス構造について
Go言語(gin)を用いたサーバを構築する際に、モジュラモノリス構造を実現するためのフォルダ構成等を試行錯誤した結果を示す。
モジュラモノリス構造は時が来た時にマイクロサービスへ簡単に切り出せるし、素晴らしいアーキテクチャですね(^_^)[こちら](https://github.com/tnakamura512/go-modular-monolith-base)にサンプルコードがあるのでそれをベースに..
# アーキテクチャ
サーバとしてはモバイルアプリから呼ばれるAPIサーバである。(Viewは存在しない)
今担当してるプロダクトに準拠してユーザ管理、メッセージ送信、歩数ランキング機能を保有しているものとする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/bb7b8079-cffc-f518-b29c-0b532dba9918.png)
– User Model
– ユーザ登録、Tokenによる認証等、よくあるやつ
– Message Model
Goでのスクレイピングに使っていたgoqueryをcollyに置き換えてみた
# はじめに
以前,goqueryを用いて東京ドームのイベント情報を1日1回取得するLambda関数を実装してみたのですが,どうやら[colly](http://go-colly.org/)というライブラリが割といいという話を後になって知りました.
深夜テンションでライブラリを置き換えてみたのでその記録です.
日本語での情報が少ないため,go言語でスクレイピングをしたい方のお役に立てれば幸いです.goqueryで実装したときの記録:https://qiita.com/a_uchida/items/1cdd7a1a6003d8a93651
# colly vs goquery
## スター数
[![Star History Chart](https://api.star-history.com/svg?repos=gocolly/colly,PuerkitoBio/goquery&type=Date)](https://star-history.com/#gocolly/colly&PuerkitoBio/goquery&Date)collyのほうが急激に伸びていますね.という
[Go] time.Time が encode & decode で元に戻らないので、time.Timeの中を調べてみた
## time.Time を encode して decode しても元に戻らない?!
[`time.Time`](https://pkg.go.dev/time) の [gob](https://pkg.go.dev/encoding/gob) の encode / decode を試していて驚いたことがありました。以下の実行結果、みなさんわかりますか?
“`golang:main.go
package mainimport (
“fmt”
“time”
)func main() {
t1 := time.Now()
b, _ := t1.GobEncode()t2 := time.Unix(0, 0)
t2.GobDecode(b)t3 := time.Now()
t3.GobDecode(b)fmt.Printf(“t1: %s\nt2: %s\nt3: %s\n”, t1.String(), t2.String(), t3.String())
fmt.Printf(“t1 == t2: %t\n”, t1 == t2)
fmt.P
【Go/Gin】ちゃんとセッションを消すログアウト
この記事はGo言語、Ginフレームワークの、とくにgin-contrib sessionのログアウトについて、しっかりセッションを消す方法について書いています。
# 通説
gin-contrib sessionの扱い方を紹介している記事で、よくログアウト機能をこのように組み立てているものが主流になっています。“`go
func Logout(ctx *gin.Context) {
session := sessions.Default(ctx)
session.Clear()
session.Save()
}
“`
しかし、この方法ではブラウザ側ではセッションが残ったままになってしまいます。
セッションの内容がnilになっているかでセッションチェックを行っている場合はちゃんとログアウトできているような挙動をしますが、ブラウザの開発ツールでcookieのセッションが残っていることが確認できることかと思います。筆者はこれを悪用したログアウト状態のPOSTを受けました(笑)
# 解決法
[GitHubのissue](https://gi
Golangで多言語対応ライブラリのようなものを作ってみた
## 背景
+ Golangを学習中で、実践的なコードを書きたかった
+ JSONファイルでエラーメッセージなどを管理できると良さそうと考えた
## 作ったもの
作ったものは至ってシンプルで、JSONファイルを読み込み、キーを指定することで定義したメッセージを取得できる。 [Githubのリンクはこちら。](https://github.com/capybara-alt/msgutil)
“`json:en.json
{
“errors”: {
“validate”: {
“null”: “column.a cannot be null”,
“invalid-value”: “Column {{0}} must be {{1}}”
},
“login”: {
“fail”: “Login fail”
}
},
“info”: {
“login”: {
“success”: “Login success!!”
プログラミング経験者へのGo入門
## 対象者
Goやりたいですってなった時
「そうだ! [Go Tour](https://go-tour-jp.appspot.com/welcome/1)やろう!」
となる人はGo Tourやってください。他の言語でプログラミングしたことあって、Go気になってるって人向けです。
## 環境
– Mac
– Go1.18## 下準備
“`
go mod init github.com/yourname/example
“`## パッケージの作成
パッケージは他の言語でいうモジュールです。
今回は2×2行列を実装します。
2×2行列は4つの整数を持ち、積を計算する `Multiple` メソッドを持つものとします。“`
mkdir matrix
vim matrix/matrix.go
“`“`go
package matrixtype (
Matrix2D struct {
// a, b
// c, d
a, b, c, d int
}
)func New(a, b, c, d int) Matrix2D {
ret
【MEMO】Goで文字コードを自動判別してCSVを読み込む/文字コードを指定して書き込む
# Goで文字コードを自動判別してCSVを読み込む/文字コードを指定して書き込む
文字コードとか種類多すぎてわからーん。
とりあえずUTF-8, Shift_JIS, EUC-UPくらい対応したい。今のところは問題なく動いているけど、例外があったら直す。
CSVの文字コード自動判別/指定書き込み
“` Go
package separate
import (
“bufio”
“bytes”
“encoding/csv”
“io”
“os”
“strings”“github.com/saintfish/chardet”
“golang.org/x/text/encoding/japanese”
“golang.org/x/text/transform”
)type EncodeType int
const (
UTF8 EncodeType = iota
UTF8BOM
ShiftJIS
EUCJP
)func ReadFileDetect(filePath string, split rune) ([][]string, Enc
[Go]並行処理・ゴルーチン
※親記事
[[Go]プログラミングノート](https://qiita.com/WisteriaWave/private/c1ff1250aa5a155debd5)# 1. 並行処理
Golangで指示できるのは **「並列処理でなく並行処理」** である。**並行処理と並列処理の違い**
![名称未設定ファイル-並行処理と並列処理.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/09086e58-4207-968e-f33b-49c0735e328b.png)
Golangでは **ゴルーチン** によって並行処理を実装できる。
ゴルーチンを使って、マシンに並列処理してもらうためには、最低でも以下が満たされてなければならない。– CPUコア数が2以上であること
– GOMAXPROCSを2以上に設定していること[この記事](https://zenn.dev/hsaki/books/golang-concurrency/viewer/term#%E3%80
[Go]プログラミングノート
# 概要
Goを勉強してわかったことを少しずつまとめていく環境構築は以下
https://qiita.com/WisteriaWave/private/450f99358fffc6a6b9f0
# 基本の形
“`main.go
// パッケージ名の宣言
package “main”// 別パッケージのインポート
import (
“sample”
// …
)// プログラムは「mainパッケージ」のmain関数から始まる。
func main() {}
“`# パッケージ
あるファイルで別ファイルに書いたコードを読み込んで使いたい場合は、
パッケージ単位でインポートする必要がある。
パッケージとは、ファイルを束ねるもので、以下のファイルは同じ「sample」パッケージに所属するものになる。“`sample_1.go
package “sample”func Sample1() int {
return 1
}
“`“`sample_2.go
package “sample”func Sample2() int {