タグ package main
人気順 10 users 50 users 100 users 500 users 1000 usersGoで関数の引数に、union型っぽくstruct Aもしくはstruct Bのどちらかを受け取れるようにしたい - $shibayu36->blog;
Goで関数の引数に、struct Aという型もしくはstruct Bのどちらかを受け取るということをしたかった。interfaceをちゃんと切ってそれに必要なメソッドをAとBに実装することで実現できることを知った上で、あまり丁寧にそういうことをせずにやりたい。 色々調べると、genericsを使うとできるようだ。 package main import ... 続きを読む
golangではスタックとヒープを気にする必要が無い
調べようと思ったきっかけは、golang では以下のように ローカル変数のアドレスを戻り値としても問題ないということ。 package main import ( "fmt" ) type Animal struct { Name string Age int } func main() { animal := allocAnimal() fmt.Printf("allocate animal structure %p", animal) } func allocAnimal() *An... 続きを読む
numpy より速い?Go の行列演算ライブラリ nune
※ Div だけ妙に遅いのが気になる NumPy は Python とは言え中身はC言語で書かれている事を考えると、結構いいパフォーマンスが出ていると言えるでしょう。 サンプルコード iris のロジスティック回帰を nune で書いてみました。 package main import ( "bufio" "fmt" "log" "math" "math/rand" "os" "github.com/vorduin... 続きを読む
古いaws/aws-lambda-goでAWS Lambdaのcontainer image runtimeを使うと刺さる - その手の平は尻もつかめるさ
具体的に言うと、aws/aws-lambda-go@v1.18.0よりも前のバージョンでAWS Lambdaのcontainer image runtimeを使うとハンドラが呼び出されず、タイムアウトするまで刺さります。 例えば以下のような非常に簡単なLambda Functionをデプロイした時、 package main import ( "context" "fmt" "github.com/aws/aws-lambda-go/ev... 続きを読む
Go で --version の出力を実装する - はやくプログラムになりたい
Go でコマンドラインツールを実装した時に $ some-tool -version のようにバージョンを出力するフラグを実装することが多いと思います.本記事はこれをどう実装するかのメモです. 手動でバージョン情報を管理 素朴にはバージョン情報を定数で持って手動で管理する方法があります. package main import ( "flag" "fmt" ... 続きを読む
Big Sky :: Go 言語の struct の実体を引数で(なるべく)渡せない様にするテクニック
Go 言語は struct のレシーバがポインタの場合は実体であってもポインタの場合であっても呼び出せるので、もし struct が参照カウントに従い動作する様な場合は実体でコピーされてしまっては困る場合があります。例えば以下の様なインタフェースを考えます。 package main import ( "fmt" "sync/atomic" "time" ) type f... 続きを読む
nilがnilじゃないのでerrorになるのを静的解析で検出する - Qiita
package main import "fmt" type MyErr struct{} func (*MyErr) Error() string { return "MyErr" } func F1() *MyErr { return nil } func F2() error { return F1() } func main() { err := F2() if err != nil { fmt.Println("Error!") } } F1()がnilを返しているのでF2()もnilを返すのですが、返ってきたerrはnilに... 続きを読む
QuoteとUnquote #golang - tenntenn.dev
Quoteを行う Goで文字列を""で括って(Quoteして)表示したい場合、fmt.Printf関数を用いて行うことが多いでしょう。 package main import "fmt" func main() { fmt.Printf(`"%s"`, "hoge") } これを実行すると以下のようになります。 $ go run main.go "hoge" 文字列中に"が含まれていた場合に、Goのソースコード上の文... 続きを読む
gowrtr - goコード生成支援ライブラリ - その手の平は尻もつかめるさ
gowrtr (go writerと発音します) というgoのコード生成支援ライブラリ (ジェネレータ群) を書きました. github.com Synopsisに書いたように, package main import ( "fmt" "github.com/moznion/gowrtr/generator" ) func main() { generator := generator.NewRootGenerator( generator.NewCommentGenerator(" THIS COD... 続きを読む
fmt.Printfなんかこわくない - Qiita
package main import ( "fmt" ) func main() { fmt.Printf("%v\n", true) fmt.Printf("%v\n", 42) fmt.Printf("%v\n", uint(42)) fmt.Printf("%v\n", 12.345) fmt.Printf("%v\n", 1-2i) fmt.Printf("%v\n", "寿司 続きを読む
Golangで軽量なSSHサーバを実装する - Fire Engine
今回は、Golangのgolang.org/x/crypto/sshパッケージを使って、SSHサーバを構築してみました。 かなりミニマムな実装ですが、リモートからSSH接続して、対話的にコマンドが実行できるところまで実装しました。 コード github.com package main import ( "golang.org/x/crypto/ssh" "log" "net" "io/ioutil" "fmt" "os/ex... 続きを読む
Goのpanicと向き合う。 - Qiita
Ho!Ho!Ho! Merry Panic!! この記事は Go Advent Calendar 2017 の25日目の記事です。 ※本記事はOSX及びUNIXシステムなことを前提として向き合います。 package main func main () { var p * interface {} * p = 0 } /* panic: runtime error: invalid memory ... 続きを読む
Go言語のHTTPリクエストのレスポンスボディーとEOF - プログラムモグモグ
2017 - 12 - 12 Go言語のHTTPリクエストのレスポンスボディーとEOF Reader interface の Read 関数は、どのタイミングで io.EOF を返すのでしょうか。 まずは strings.Reader で見てみましょう。 package main import ( "fmt" "strings" ) func main() { r := strings.NewRe... 続きを読む
Goでコマンドライン引数と環境変数の両方からflagを設定したい - Qiita
Goで実装したプログラムでオプションをコマンドライン引数から取るには標準の flag パッケージを使いますが、値を環境変数からも読みたいことがあります。(特に Docker で動かす場合) https://github.com/namsral/flag を使うと便利です。標準の flag を置き換える形で、import 1行で対応できます。 package main import ( "fmt" ... 続きを読む
【golang学習シリーズ】iotaの不思議 | from umentu import stupid
golangのiotaの動作について簡単な例を書いてみた。iotaなるものを初めて知ったので、まとめてみた。 変数に連番を作る時にとても便利だし、固有の値を自動的に振り分けるのに便利。 詳細な仕様は公式リファレンスを参照のこと。 package main import ( "fmt" ) func main(){ /* 0から始まり、自動的にインクリメントされる */ const ( a = io... 続きを読む
Goのスコープについて考えてみよう #golang - Qiita
はじめに Twitterで以下のような投稿をしてみました。 https://twitter.com/tenntenn/status/815807925222412292 この問題は、以下のコード中に存在するスコープの数を聞いている問題です。 package main import "fmt" func main () { const message = "hello, world" fmt . P... 続きを読む
Big Sky :: Vim プラグインの機能として golang を使う。
golang 1.5 から、x86_64 のみですが -buildmode=c-shared というビルドオプションが足される事になりました。 これは、golang で共有ライブラリを生成する為のオプションで、例えば package main import ( "C" "fmt" ) var ( c chan string ) func init() { c = make(chan string)... 続きを読む
Go言語でルーズにJSONを扱えるライブラリJasonが便利だった - Qiita
GoでJSONを扱うとstructとかinterface{}で結構面倒だったしますが、jasonと言うライブラリを使うとかなりルーズに扱えて、ものぐさな私にはちょうど良かったです。 Jason - JSON Library for Go 基本的にはパーサーに特化しているようです。つまり読み込み専用。 単純なJSONだと package main import ( "github.com/anton... 続きを読む
Big Sky :: ソースに一行追加するだけですべての HTTP 通信が環境変数指定のプロキシではなくIEの設定になるモジュールを書いた #golang
通常、golang のデフォルトの HTTP クライアントは環境変数 HTTP_PROXY もしくは HTTPS_PROXY を参照してプロキシに接続し、環境変数 NO_PROXY で指定されたホストが無視される仕組みになっています。しかし一般ユーザにとって環境変数の設定は、難易度の高い作業だったりします。 使用例 たとえばこういうコードに… package main import ( "fmt"... 続きを読む
Big Sky :: golang で N 個の chan を同時に待つ
あと最近の発見と絶望は、C.selectが呼び出せないこと。select中のdefaultでnonblocking相当にできるけど、可変数なfdをselectしたい相当をどう書けばいいんだろうか。 #golang— HiroakiKawai (@kwi) July 28, 2014 reflect.Select を使います。 package main import ( "fmt" "math/ra... 続きを読む
[Go] port 80を開いたあとroot権限を捨てるwebサーバの例 - Qiita
port 80を開くためにはroot権限が必要だが、開いたあとはセキュリティーリスクを最小限にするために一般ユーザ権限に降格したい、というWebサーバをGoで書く例です。 rootで起動した状態で":80"をlistenして syscall.Setuid() で一般ユーザになり http.Serve()する package main import ( "net" "net/http" "sysca... 続きを読む
Big Sky :: golang の sync パッケージの使い方
golang と言えば非同期に特化した言語ですが、慣れない内は簡単な非同期しか使えません。しかし sync パッケージを知る事でもっとカジュアルに、かつ確実な非同期処理を行う事が出来る様になります。 今日はそんな sync パッケージについて説明してみたいと思います。 sync.Mutex ご存じ sync.Mutex です。皆さんが一番使う排他制御だと思います。 package main imp... 続きを読む
Big Sky :: Golang の channel の使い所
golang の特徴と言えば goroutine と channel ですが、その使いどころに悩む人もおられる様です。 goroutine は非同期に実行される処理、channel はその groutine と通信する為の仕組みと考えると分かりやすいです。 package main import ( "fmt" "time" ) func main() { task := make(chan st... 続きを読む