最近不眠症気味であまり眠れてません
今は早朝5時です。
今日アマゾンで買った M.2 SSD が届くのでメイン機にLinuxをインストールするつもりなんですけど、そのために体調を万全にするために寝たかったが眠れませんでした。
1. try マクロ
いい加減、
resp, err := http.Get(url)
if err != nil {
return nil
}
と書くのは飽きました。
try マクロ (名前は適当) は1つ以上の任意の型を取ります。
ただし、一番右の引数は、その関数の返り値の一番右の型と同じかつ、nilable でなければなりません。
一番右の変数が nil
でない場合、このマクロはこの関数を一番右の返り値は先程の値、それ以外はゼロ値で return
します。
そうでなかった場合は、一番右以外の変数を返します。
このマクロを使うことで、上記のコードは以下のように書けます。
resp := try(http.Get(url))
2. デフォルト引数
そろそろ type PostStatusParam struct
から脱却しませんか?
func PostStatus(
text string,
spoiler bool = false,
photoes []io.Reader = nil,
ctx context.Context = context.Background(),
) (*Status, error) {
// send status
}
func main() {
// do something
PostStatus("the cake is a lie...", spoiler: true, photos: []io.Reader{f})
}
関数のオーバーロードはいらないよ。
3. nil非許容型
nilable な型の後に !
をつけることで、nil
が入れられなくなります。
また、変数が宣言されるときに?をつけることで、nil許容型に変換されます。
var r io.Reader! // error
r, err := os.Open("readme.txt") // r は nil非許容型, err は nil許容型
r = nil // error
r2? := r // r2 は nil許容型
r2 = nil // OK
Golangで?を追加するのは難しそうだなあと思って逆にすれば良いんじゃねと思った。
os.Open
はエラーの場合、r
が nil
になるじゃないかとお思いですが、呼び出してもエラーしか返さないダミーのリーダーが返されるようになります。
破壊的変更ですね。
いい加減流行りに乗りませんか。
4. イテレータ
Genericsが追加されたことだし、GoでもPythonのyieldみたいなことがしたい。
けどコンパイル言語だから難しそう。
チャネル使えば似たようなことが出来るのは知ってるよ?
議論はされまくってたから現実味は一番ある。
5. anyに続く新しい型
個人的に
type void struct{}
がほしいなぁと思っている。
まあ正確にはvoidじゃないんだろうが。