あったら良いな こんなGoのアップデート

最近不眠症気味であまり眠れてません

今は早朝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 はエラーの場合、rnil になるじゃないかとお思いですが、呼び出してもエラーしか返さないダミーのリーダーが返されるようになります。

破壊的変更ですね。

いい加減流行りに乗りませんか。

4. イテレータ

Genericsが追加されたことだし、GoでもPythonのyieldみたいなことがしたい。

けどコンパイル言語だから難しそう。

チャネル使えば似たようなことが出来るのは知ってるよ?

議論はされまくってたから現実味は一番ある。

5. anyに続く新しい型

個人的に

type void struct{}

がほしいなぁと思っている。

まあ正確にはvoidじゃないんだろうが。

Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です