20211010のGoに関する記事は4件です。

Goのsortパッケージでよく使う関数

はじめに Go標準のsortパッケージでは、スライスの並び替えなどをサポートしています。 本記事では、sortパッケージで一般的に利用される関数を紹介していきます。 Ints int型のスライスを昇順で並び替えます。 go package main import ( "fmt" "sort" ) func main() { s := []int{5, 2, 3, 1, 4} sort.Ints(s) fmt.Println(s) //=> [1 2 3 4 5] } 一般的なソート(バブルソート)と比較してみます。 go package main import "fmt" func main() { s := []int{5, 2, 3, 1, 4} for i := 0; i < len(s)-1; i++ { for j := 0; j < len(s)-1-i; j++ { if s[j] > s[j+1] { s[j], s[j+1] = s[j+1], s[j] } } } fmt.Println(s) //=> [1 2 3 4 5] } Intsを使うだけでも、かなりのコード量を削減できますね。 Strings string型のスライスを昇順で並び替えます。 go package main import ( "fmt" "sort" ) func main() { s := []string{"A", "C", "ab", "aa", "B"} sort.Strings(s) fmt.Println(s) //=> [A B C aa ab] } Slice 第2引数で渡した関数の処理を条件として、スライスを並び替えます。 若干ややこしいので、コードも交えて説明します。 go package main import ( "fmt" "sort" ) func main() { people := []struct { Name string Age int }{ {"Gopher", 7}, {"Alice", 55}, {"Vera", 24}, {"Bob", 75}, } sort.Slice(people, func(i, j int) bool { return people[i].Name < people[j].Name }) fmt.Println(people) //=> [{Alice 55} {Bob 75} {Gopher 7} {Vera 24}] } 第2引数で渡した関数内で、for文が2重で実行されていると考えてください。 people[i].Nameとpeople[j].Nameを比較し、小さい要素を前に持ってくるイメージです。 Ageで並び替えたい場合は、Nameの箇所をAgeに変更してください。 まとめ アウトプット感覚で書きましたが、ご満足いただけたら幸いです。 Goを触り初めて1週間のド素人ですので、間違いなどがありましたら指摘していただけると助かります。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

go: cannot find main module, but found|GolangのテストをGitHub Actionsで回した時のエラー

 状況 ある書籍のサンプルコードを動かしていたところ遭遇したエラーです。 Golangは触ったこともない状態で進めていたのでモジュールやGoPathなども 理解できていない状態でした。 エラーメッセージ GitHub ActionsでGolangのテストファイルを実行した時に出たエラーです。 error.go go: cannot find main module, but found .git/config in /__w/app-name/app-name to create a module there, run: go mod init Error: Process completed with exit code 1. 原因 go.modファイルがないことでした。 詳しい原因知っている方いましたらコメントいただけたら嬉しいです。 解決方法 以下のコマンドでgo.modファイルをプロジェクトディレクトリのルートに生成しpushしたらエラーが消えました。 go.sh $ go mod init github.com/example/go-app-name
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Go] KeyLogWriter (crypto/tls) を使って TLS 通信を Wireshark で復号化する

一般にブラウザや curl で同様に TLS のダンプをしたい時は、SSLKEYLOGFILE 環境変数に TLS master secrets 情報を書き出すファイルを指定し、Wireshark などの外部アプリケーションにこのファイルを食わせることで capture した暗号化通信データを復号化し、手元で生の HTTP リクエスト情報 (over TLS) を手軽に解析できることが知られています。 KeyLogWriter (crypto/tls) Go でも同様に crypto/tls package がサポートしている KeyLogWriter を使うことで TLS master secrets 情報を書き出すことができます。 参考: https://pkg.go.dev/crypto/tls#example-Config-KeyLogWriter // 出力先ファイルを指定 w, err := os.OpenFile("tls-secrets.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{ KeyLogWriter: w, }, }, } // 以降この client で行われた通信は Wireshark で復号化して解析可能になる Wireshark で TLS master secrets ファイルを読み込む方法については上記のリンク内でも詳しく説明されているので、そちらを参照ください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Go】Goのwebフレームワークginを使ってHello World(Part1)

自己紹介 Qiita初投稿なので軽く自己紹介です。 新卒から3年ぐらいはDBA周りを経験してだらだら無駄な時間を過ごしてましたが、 2年前ぐらいにjavaをメインにしたweb系の会社に転職してからようやく自己学習を始めた出遅れ感満載のエンジニアです。 Goを勉強しようと思った背景 注目言語だからちょっと挑戦してみたかったというのもありますが、 平行処理がすごい楽と知人から聞いたのでどんなもんなんだと興味本位で勉強したいと思ったからです。 webフレームワークを使おうと思った理由としては、自身がweb系が得意としているので、主にjava(Spring)との違いが感じやすいかと思ったからです。 環境 Mac(M1): BigSur 11.5.2 Go: go1.17.2 darwin/arm64 エディタ: GoLand DB: MySQL 8.0 パッケージ管理:Go Modules0 とりあえずのHello World ginを追加して go get github.com/gin-gonic/gin main.goを書いて〜 main.go package main import ( "github.com/gin-gonic/gin" "work-study-go/web/route" ) func main() { engine:= gin.Default() // route.goのDefineRoutesを呼び出す route.DefineRoutes(engine) // ここでポートを指定する。 engine.Run(":3000") } ルーティングのコード書いて〜 ※個人的にルーティングの定義は分けたかったので分けています。 route.go package route import ( "github.com/gin-gonic/gin" "net/http" ) func DefineRoutes(r gin.IRouter) { r.GET("/", func(ctx *gin.Context){ // HTTPステータス200,レスポンスのdataに"Hello World"を返却 ctx.JSONP(http.StatusOK,gin.H{ "message": "ok", "data": "Hello World", }) }) } 実行してみる go run main.go Curlで叩いてみる。 curl http://localhost:3000/ route.goに定義したレスポンスの内容が返却されてますね。 % curl http://localhost:3000/ {"data":"Hello World","message":"ok"} まとめ 初めてSpringを触った時はHello Worldを表示するだけでもちょっと詰まったのですが、 意外と特に詰まることなく簡単に実装できました。 ※HTMLも全然わかってないのにいきなりThymeleafを使ったからですが。。。 まだ勉強中なので至らない点が多々ありますが、これを基にしてwebアプリを作っていきたいと思います。 その過程でまた投稿していくので、これからGoを勉強していく方に少しでも参考になればと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む