Overview 今月にもリリースされる予定のGo1.23 に同梱されているiterator package をだいぶ今更ながら触ってみました。 どういうものか、ということの概要は知っていましたが、まぁ一旦自分でも触ってみるか、ということで触ってみて、実際動かしながら触れることで思ったことを残しておきます。 実行方法 手元はGo1.22 なのでGOEXPERIMENT=rangefunc を付けてGo のファイルを実行しました。 感想 先に感想だけ書いておくと、自分としてはiterator は少し直感的じゃないなという印象を持ちました。 例えばシンプルなiterator 処理を書こうと思うと以下になりますが、 func TestSeq(t *testing.T) { for v := range seq { t.Log(v) } } func seq(yeild func(i
なんだこれは 少し前に、Goのプログラムをチューニングして遊びたいなと思い、brainf*ckインタプリタを作って高速化しました。 忘れないうちにそのときのことを書いておこうという記事になります。 高速化!高速化!うおおおおお! できたもの こちらが最終的に完成したものになります。 ベンチマークにはbfでマンデルブロ集合を描画するプログラムを利用しています。 それを私の手元のPCでインタプリタに食わせたときの実行時間を減らしていくという形で高速化を進めました。 始めた当初は描画に42.36sかかったところ、最終的には2.271sで描画できるようになりました。ついでにbfをllvm irにトランスパイル?するプログラムも書いていて、それを使ってコンパイルした場合は0.466sでマンデルブロ集合を描画することができます。 皆さんもぜひ高速化を… 途中からは以下のようなルールを設け、友人らと速度

Goで書かれているTaskという名前のタスクランナーを使い始めた。仕事でMakeをタスクランナーとして使っていたところを、Taskに置き換えようという動きがあったので、仕事で使いつつプライベートでも使って慣れようとしている。 Taskでは Taskfile.yml というYAMLファイルにタスクを書いて、task コマンドで実行する。Makefileよりは読みやすいし書きやすそうでいい。 taskfile.dev 補完 taskコマンドの補完が効かなくて不便だと思っていたら、補完のセットアップをしたらできると同僚に教えてもらった。zsh用のセットアップをすると無事補完が効いて、効率的に使えるようになってよかった。 ホーム|タスク #補完のセットアップ task -l と task -a taskコマンドには -l または --list というオプションがあるので、これでタスクの一覧が確認で
フラットパッケージは正義か? 私がSNS で何度か言及した以下の記事がある。 フラットパッケージ戦略は,確かにGo の文化圏においては一定の支持を集めている。Go の公式リポジトリや有名ライブラリなんかも,Java などの言語に比べたらずっとパッケージ階層が浅く,ネストしていないものが多いと思う。 しかし,それも 「コードベースを小さく保つ」 を大前提としていることを忘れてはならない。 DDD やクリーンアーキテクチャといった言葉が飛び交うぐらいの規模であれば,パッケージを切ることに関して後ろめたさを感じる必要はない。 むしろ,大きなコードベースが誕生することが開発初期から簡単に予見できるような状況で, YAGNI という言葉に甘んじて設計を放棄するのは極めて悪手であると私は断言する。身を以て失敗を経験した私の口から伝えたい。
タイトルの通りです。 以下のようにint型のFooTypeとBarTypeを宣言して、それぞれ60をenumで持つ値をチェックしてみます package main import "fmt" type FooType int type BarType int const ( Hoge FooType = 60 Nyan FooType = 61 Baz BarType = 60 ) var someTypes = []interface{}{ Hoge, Baz, } func main() { for _, t := range someTypes { if t == Baz { fmt.Println("same") } else { fmt.Println("difference") } } if Baz == 60 { fmt.Println("Baz is 60") } else
「レシーバ」とはGo 言語はある種のオブジェクト指向プログラミング (OOP) 言語であり、 OOP 言語の慣例通り、メソッドを呼び出される対象のことを「レシーバ」と呼びます。 ちなみになぜ「レシーバ」と呼ぶのかというと、昔の OOP 言語の文脈ではメソッド呼び出しのことを「メッセージの送信」と言い、メソッドを呼び出される側は「メッセージの受信側」だからです。 「値レシーバ」と「ポインタレシーバ」Go 言語では「値」と「ポインタ」が明示的に区別されているため、たとえばある構造体に対してメソッドを定義する場合でも、「値型」に対する定義なのか「ポインタ型」に対する定義なのかはっきりと区別しなければなりません。それぞれについて簡単に説明します。 値レシーバ「値型」に対してメソッド定義されたものが「値レシーバ」です。Go 言語では構造体は値なので、以下の例では Person という値型に対して
Go の言語仕様はシンプルで他の言語に比べてはまりどころが少なくて学習コストが小さめな言語のように思います。しかし、それでもはまるところがないわけではないので、自分がはまって時間を無駄にしてしまったことを書き留めておきます。 念の為誤解のないように追記しておくと、この文書の目的はGo を批判することではなくGo がGo であるがゆえにC++/Java/Python など利用者がGo を使い始めるときに困惑あるいは誤解するであろうポイントをまとめておくことで初めてGo を触る人がスムーズにGo を使い始められるようにすることです。私個人はGo はバランスがとれた良い言語でだと思いますし、気に入っています。 目次 interface と nil (Go の interface は単なる参照ではない) 文献 メソッド内でレシーバ(this, self)が nil でないことをチェ
1リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く