- 1. goのポインタ
- 2. Magicodeという簡単に稼げるエンジニア向けブログサービスを作ったので使って欲しい
- 3. TCPによるソケットプログラミング
- 4. gin favicon
- 5. 【Go】protoc-gen-validateを含めたprotoファイルでコード出力時に`protoc-gen-go: invalid Go import path`が発生
- 6. golang filepath.PathSlash(path string) (string, error)
- 7. [Go] Range
- 8. go言語のインポートについて(「Go言語でつくるインタプリタ」の1.3字句解析器のエラー対処)
- 9. 【Go(golang)×Docker】自作パッケージの関数を呼び出す方法
- 10. Goでバブルソート
- 11. Go言語 再帰を使用したフィボナッチ数
- 12. Firestoreをサーバサイドで使うTips
- 13. [翻訳] Golang におけるinterface 実装のベストプラクティス
- 14. 【Go, FileServer】画像の配信
- 15. 競プロ落とし穴 #1 SetでDFS
- 16. Go言語 無名関数の書き方
- 17. golangci-lint: exhaustivestruct
- 18. Go言語 ゴルーチン select
- 19. 【GitHub】Goのインデントがおかしい問題を解決する
- 20. Rocky Linux 8.4にGo環境をインストール(Linux)
goのポインタ
## ポインタ
– ポインタを渡すというのは、変数の内容を渡すのではなく、変数のメモリの値を渡すという意味
– なので、渡された関数などで、値の変更が合った場合は、渡された関数の外であってもそのポインタを参照すると値は変わっている
– ポインタではない通常の変数のわたし方の場合は、変数のコピーが渡されるため、関数内で値が変わった場合、変数が渡された関数の中と外でその変数を参照しても値は変わっている“`golang
package mainimport “fmt”
// ポインタ
func pointer(x *int) {
*x += 1
fmt.Println(“ponter func: “, *x)
}// ポインタではない
func nopointer(x int) {
x += 1
fmt.Println(“nopointer func: “, x)
}func main() {
z := 2
pointer(&z)
fmt.Println(z)fmt.Println(“————“)
y := 2
nopoi
Magicodeという簡単に稼げるエンジニア向けブログサービスを作ったので使って欲しい
https://jp.magicode.io/
# はじめに
[「Jupyter Notebookを一瞬で記事にできて誰でも収益化できるサービス作ってみた」](https://qiita.com/Taiki92777/items/f408846297526addba4f)という記事を以前書きましたが,そのサービス名をNoteboxから**Magicode**に変えて再リリースしました!https://qiita.com/Taiki92777/items/f408846297526addba4f
# Magicodeとは?
QiitaさんやZennさんのようなエンジニア向けのブログサービスです。Magicodeという名称は,magicとcodeを組合せた造語です。基本的にはマークダウンで自分のブログが書けるサービスですが,特殊な機能が以下の4つほどあります。# 機能1. ブラウザ上でコードを実行できる
ハリーポッターの新聞は動きますよね。そんな感じでMagicod
TCPによるソケットプログラミング
## TCPとは
TCPには途中経路上で喪失や変質してしまったパケットを検出し再送する機能や、利用可能なネットワーク帯域に応じて送信する量を調整する輻輳制御機構など、さまざまな機能があります。
複数の通信を同時に行えるようにする仕組みとして、ポート番号によるセッションの識別もTCPの大きな特徴の1つです。## TCPによるソケットプログラミング
ソケットプログラミングを行うとき、両端のIPアドレスとポート番号が必要になる。
## クライアント側の実装
“`go:client.go
package mainimport (
“fmt”
“net”
“os”
)// go run client.go 127.0.0.1:10000
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, “Usage: %s host:port “, os.Args[0])
os.Exit(1)
}
service := os.Args[1]
// ソケットの作成 & 接続相手のIPアドレスとポート
gin favicon
https://github.com/thinkerou/favicon
こちらを元にしました。“`golang
package middlewaresimport (
“bytes”
“fmt”
“io/ioutil”
“log”
“net/http”
“os”
“path/filepath”“github.com/gin-gonic/gin”
)// パスの区切り文字にはos関係なくスラッシュで渡す。
func ServeFavicon(path string) gin.HandlerFunc {
// “/”区切りのパスをosの区切り文字でのパスに変換。
path = filepath.FromSlash(path)
// 空文字でないandOSの区切り文字でないなら
if len(path) > 0 && !os.IsPathSeparator(path[0]) {
// 作業ディレクトリを取得
wd, err := os.Getwd()
// 作業ディレクトリの取得に失敗したら終了
if err != nil {
【Go】protoc-gen-validateを含めたprotoファイルでコード出力時に`protoc-gen-go: invalid Go import path`が発生
## 概要
GoのgRPCで、バリデートを実装する際に便利なのが、[protoc-gen-validate](https://github.com/envoyproxy/protoc-gen-validate)です。[【Go】gRPCのリクエストバリデータを自動生成する](https://note.com/scg_tech/n/nb12a33bfd391)の記事で紹介されている通り、protoファイルでバリデートの定義を設定することで、バリデートのコードを自動生成してくれます。
今回はprotoc-gen-validateを含めたprotoファイルで、コード出力時に`protoc-gen-go: invalid Go import path`というエラーが発生したので、対応方法などをメモ書きします。## 事象発生時の状況
エラーが発生したprotoファイルは以下の通りです。
なお、使用したProtocol Buffersのバージョン`3.19.4`はです。
“`proto:src/proto/authenticationUser.proto
syntax = “proto3”;
golang filepath.PathSlash(path string) (string, error)
“`golang
func Main() {
fmt.Println(filepath.FromSlash(“./hello/hifle¥feilfe/fel¥HELLO.go”))
}
//-bash-4.2$ go run main.go
//./hello/hifle¥feilfe/fel¥HELLO.go
//osがwindowsなら.¥hello¥hifle¥feilfe¥fel¥HELLO.goになっている?
“`
[Go] Range
# Range
Range は要素の値のコピーが返されるので、
返される要素を変更しても、元の値を影響しない
変更したい場合は、直接参照すれば## サンプルコード
“`go
package mainimport “fmt”
func main() {
users := [3]string{“A”, “B”, “C”}
fmt.Printf(“%#v\n”, users)for _, u := range users {
u += “edited”
}
fmt.Printf(“%#v\n”, users)for i := 0; i < len(users); i++ { users[i] += " edited" } fmt.Printf("%#v\n", users) } ``` ```shell:output [3]string{"A", "B", "C"} [3]string{"A", "B", "C"} [3]string{"A edited", "B edited", "C edited"} ```
go言語のインポートについて(「Go言語でつくるインタプリタ」の1.3字句解析器のエラー対処)
## 概要
「Go言語でつくるインタプリタ」の1.3字句解析器を実行中にエラーで躓いたので備忘録
対象者は
* 解析のためにこの本を買ったけどgo言語がわからずに躓いた人
* go言語のインポート関係で躓いてる人## 環境
win11
go 1.18
書籍に記載のあったdirenvは未使用## エラー内容
lexer_test.goで以下のエラー。ヒントで隠れてるのでコードを以下に記載。
“`go
import (
“testing”
“monkey/token”
)
“`## 解決方法
shellで
“`
#PROJECT_NAMEじゃなくてもなんでもいいかも
go mod init PROJECT_NAME(サンプルプログラム試しているルートフォルダ)
“`
その後import文のmonky/tokenをプロ
【Go(golang)×Docker】自作パッケージの関数を呼び出す方法
## はじめに
この記事では、**docker×go環境で自作パッケージとして切り出した関数を実行する方法**を書いています。
別パッケージの関数がうまく読み込めず苦戦した(go modulesを理解できていなかった。。)ので、備忘録的にまとめました。
#### 前提
– Dockerがインストールされていること。#### 実行環境
– macOS Catalina: 10.15.4
– docker version: 19.03.13### 目次
– dockerによる環境構築
– main.goファイルを作成
– シンプルなプログラムを実行
– サブパッケージに関数を切り出す
– 切り出した関数をmain.goで読み込んでプログラム実行### 最終的なディレクトリ構造とゴール
“`
.
|–Dockerfile
|–docker-compose.yml
|–go.mod
|–main.go
|–pokemon
| |–houen.go
| |–kantou.go
| |–secret.go
“`上記、pokemonパッケージ下の各
Goでバブルソート
最近またアルゴリズムの勉強を始めようと思い、まずはバブルソートを作ってみました。以前はこういう系はPythonでやってたんですが、最近Goの勉強もしてるのでGoで作ってみました。
こちらのオンラインエディタが勝手にフォーマットもしてくれて便利でした。
https://go.dev/play/## コード
“`go
package mainimport “fmt”
func main() {
numbers := [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}switched := true
for maxIndex := len(numbers) – 1; switched && 0 < maxIndex; maxIndex-- { switched = false for i := 0; i < maxIndex; i++ { left := numbers[i] right := numbers[i+1] if left > right {
numbers[i] = right
nu
Go言語 再帰を使用したフィボナッチ数
## 再帰
ある処理内部で、再びその処理自身を呼び出すような処理。## フィボナッチ数
2つ前の項と1つ前の項を足し合わせていくことでできる数。
自然界に多く見られる、数学的規則性。## Code
“`Go
var fibonacci func(n int) <-chan int // 何番目を求めるかを定義 fibTarget := [5]int{10, 15, 20, 25, 30} // フィボナッチ数を求めるための無名関数を格納 fibonacci = func(n int) <-chan int { result := make(chan int) // 無名関数によるゴルーチン go func() { // チャネルを閉じるための予約 defer close(result) // 2以下の場合は必然的に1 if n <= 2 { result <- 1 return } // 再帰により、n-1番目を求める f1 := <-fibonacci(n-1) // 再帰により、n-
Firestoreをサーバサイドで使うTips
# はじめに
Firestore、便利ですよね。大好きなGoogle Cloudプロダクトのひとつです。
ネイティブモードで利用して、**Web or モバイルアプリからmBaaS的に使うのが鉄板**だと思います。https://firebase.google.com/products/firestore/?hl=ja
ですが例えば**バッチジョブでデータを洗い替えたりする場合**等、サーバから直接触りたくなる状況もちょくちょくあるかと思います。
直近、サーバからFirestoreを触る機会がそこそこあったので、その中で得た備忘録的なものをまとめました。
**サンプルコードはGo**ですが、他の言語でも参考になる部分も多いかと思います。
思いつき次第随時更新いたします??# Tips一覧
## 1. ローカル環境からFirestoreを利用するFirestoreを組み込んだサーバアプリケーションをローカルで開発する場合、直接開発環境のFirestoreに繋ぎ込む方法と、Firestoreエミュレータを利用する方法があります。
### 開発環境のFirestoreに直
[翻訳] Golang におけるinterface 実装のベストプラクティス
この記事は [Best Practices for Interfaces in Go](https://blog.boot.dev/golang/golang-interfaces/) を翻訳した記事になります。
誤訳がある可能性があるため、リンク先の元記事をあらためて参照お願いします。## Golang におけるinterface とは何か
ほかのtype が実装できるカスタムtype のこと
これによって高い抽象度を得ることができる
他のtype が全てのメソッドを実祖した時に実装できる
## interface のベストプラクティス
そもそも綺麗なインターフェースを書くのは難しい
シンプルなコードもすぐに複雑になる
下記の3点を守れば綺麗なままでいられる
– interface は小さく作る
– interface には知識を入れない
– interface をclass のように扱わない### interface は小さく作る
本記事に置いて最重要なトピック
interfaceはアイデアやコンセプトを表すための最小の必要な振る舞いの定義を意味している
[HTTP Pa
【Go, FileServer】画像の配信
サーバ上に保存してある画像を各クライアントのブラウザに配信をするため、FileServerを利用した。
# 前提
“`plantuml@startuml
title フローは以下のようなものを想定
skinparam responseMessageBelowArrow true
autonumber
クライアント -> サーバ: ユーザ情報取得API Request
クライアント <-[#0000FF]-- サーバ: ユーザ情報の中に画像パス(/image/profile/1.jpg)を含んだJSONをResponse クライアント -> サーバ: 画像URL(https://hoge.jp/image/profile/1.jpg) Request
クライアント <-[#0000FF]-- サーバ: 画像データ Response @enduml ``` クライアントでは、ユーザ情報取得APIで返却されたJSONの中にある画像PathからURLを作りsrcに入れる ```html
競プロ落とし穴 #1 SetでDFS
# 競プロ落とし穴シリーズ
シリーズと書いてるけど多分これが初回で最終回:hugging:
競プロの問題を解いていてつまづいたところをメモしていくよ# 今回解いていた問題
https://atcoder.jp/contests/abc198/tasks/abc198_d出現する文字列(たかだか10種類)について全探索を行って条件を満たす解を探す問題
以下では簡略化したコードで考えていくよ
# 間違ったコード
“`golang
func AssignWithSet(N int) {
set := make(map[int]struct{})
for i := 0; i < N; i++ { set[i] = struct{}{} } ret := make(map[int]int) used := make(map[int]bool) for v := range set { ret[v] = -1 } scnt := 0 var DFSWithSet func(int) DFSWithSet = func(num int) { if num
Go言語 無名関数の書き方
Go言語の無名関数の記事が少ないので、ここでいくつか例を上げたいと思います。
## 環境
go 1.18## 例1 : 即時実行
“`go:input
package mainimport “fmt”
func main() {
// 無名関数
func() {fmt.Println(“Welcome! to Go Lang”)
}()}
“`“`terminal:ouput
Welcome! to Go Lang
“`
## 例2 : 変数に代入してから実行
Go言語では無名関数を変数に割り当てる事ができます。
無名関数を変数に割り当てると、その変数は関数型となり、関数をコールするようにその変数をコールする事ができます。
“`go:input
package mainimport “fmt”
func main() {
// 変数に無名関数を割り当て
value := func() {
fmt.Println(“Welcome! to Go Lang”)
}
value()}
“`“`terminal:ou
golangci-lint: exhaustivestruct
備忘録。
構造体のフィールドが全部初期化されているかどうかをチェックしたい場合は[exhaustivestruct](https://github.com/mbilski/exhaustivestruct)が便利。
exhaustivestructを有効化した上でstruct-patternsに構造体が [Path#Match](https://pkg.go.dev/path#Match) に合致するように記載する。
struct-patternsはパッケージ名も含められるので別パッケージで同名の構造体があっても対応できる。ハマったポイントとして、struct-patternsに指定するのはチェックしたい構造体が定義されているパッケージおよび構造体名を指定する必要がある点。
勘違いしてチェックしたい構造体が呼び出されているパッケージ名を指定しようとしていた。“`go
package exampleAtype Target {
Hoge string
}package main
func main() {
t := Target{}
}
“`
上記の場合、
Go言語 ゴルーチン select
## select
複数のゴルーチンからの、チャネルを介した値受け渡しを実現させるための構文
selectを使用することにより対象のチャネルからピンポイントで値を受け渡せる。## Code
“`Go
// ある数以上の素数を、1つ求める関数
func primeRoutine(targetLine int, primeChan chan int) {
fmt.Printf(“%d Line Target Goroutine Wake UP \n”, targetLine)
i := 0
for {
// 値のインクリメント
i++
// 素数チェック
if checkPrime(i) && targetLine < i { fmt.Printf("%d Line Target Goroutine Shut Down \n", targetLine) // チャネルにデータ送信 primeChan <- i return } } } // メイン関数 func main() { // 求める素数の基準値 targetLin
【GitHub】Goのインデントがおかしい問題を解決する
## 原因
GitHub上でデフォルトのタブサイズが8になっているから。
つまり、`1tab = 8 半角スペース`という状況です。## 解決策
1. `https://github.com/settings/appearance`へ行きます。
1. Tab Sizeを4にします。
## 余談
chromeの拡張機能だったり、クエリパラメータでタブサイズを変える方法がググると出てきたのですが、最近デフォルトの設定になったんですかね?
Rocky Linux 8.4にGo環境をインストール(Linux)
linuxのOSにGo環境をインストールする手順です。
今回はRocky Linux 8.4を使用しています
※Centos8系は同手順で同様にインストールできる認識手順
cd /usr/local
バージョン15をインストール(2022年4月時点の最新バージョンは17)
wget https://golang.org/dl/go1.15.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.15.2.linux-amd64.tar.gz
rm -rf go1.15.2.linux-amd64.tar.gz
バージョン確認
go version
go version go1.15.2 linux/amd64環境変数を設定
vi .bash_profile
export ROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$ROOT/bin#設定後読み込み