成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 要加個箭頭語法,這下更像 PHP 了!

開發(fā) 前端
原提案作者的本意,可能是需要讓匿名閉包更加的簡潔,降低代碼復(fù)雜度。但其實這本質(zhì)上,節(jié)約的只是明面上的復(fù)雜度。一旦引入這類 “箭頭” 語法,可能會更大的加劇腦子轉(zhuǎn)換的開銷。看代碼時,得想想對對,會加重底下的腦力開銷。

大家好,我是煎魚。

在六一兒童節(jié)前夕在摸煎魚時,看到一個很神奇的 Go2 的技術(shù)提案,想要加一個更簡單、更輕量的匿名函數(shù)語法。

今天就由煎魚和大家一起看看。

新提案

新的 Go 提案目的是添加輕量級的匿名函數(shù)語法,業(yè)內(nèi)別名又叫 “箭頭語法”,是由 @Damien Neil 所提出的,提案的來源是《proposal: Go 2: Lightweight anonymous function syntax[1]》,褒貶都有:

圖片

我們由此進行展開。

如下例子:

import (
"fmt"
"math"
)

func compute(fn func(float64, float64) float64) float64 {
return fn(3, 4)
}

func main() {
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(5, 12))

fmt.Println(compute(hypot))
fmt.Println(compute(math.Pow))
}

上述代碼主要是實現(xiàn)了多個匿名的閉包函數(shù),實際上業(yè)務(wù)邏輯沒有什么。認為由于閉包簽名繁雜,導(dǎo)致代碼可讀性不高。

為了避免這種情況,許多語言允許省略匿名函數(shù)的參數(shù)和返回類型,因為它們可能是從上下文派生的,能夠直接被復(fù)用。

如下 Scala 的例子:

compute((x: Double, y: Double) => x + y)
compute((x, y) => x + y) // Parameter types elided.
compute(_ + _) // Or even shorter.

Rust 的例子:

compute(|x: f64, y: f64| -> f64 { x + y })
compute(|x, y| { x + y }) // Parameter and return types elided.

因此這個 Go 提案就是希望針對匿名閉包增加這個輕量級的語法,讓代碼看起來更加的簡潔,讓代碼可讀性提高。

PHP 的例子:

$x = 1;
$fn = fn() => $x++; // 不會影響 x 的值
$fn();
var_export($x); // 輸出 1

更有那味了。

真實案例

Cap'n Proto

Go 開源庫 Cap'n Proto(capnproto/go-capnproto2[2])是一種極其快速的數(shù)據(jù)交換格式,類似于Protocol Buffers,但速度快得多。

以下是其代碼使用片段:

s.Write(ctx, func(p hashes.Hash_write_Params) error {
err := p.SetData([]byte("Hello, "))
return err
})

假設(shè)我們是 Rust,效果如下::

s.Write(ctx, |p| {
err := p.SetData([]byte("Hello, "))
return err
})

errgroup

這個 errgroup 庫相信大家不會陌生,常用于多個 goroutine 的異步場景中的 err 處理和同步。

以下是其使用片段:

g.Go(func() error {
// perform work
return nil
})

假設(shè)我們是 Scala,效果如下:

g.Go(() => {
// perform work
return nil
})
只從代碼數(shù)量來對比看,確

只從代碼數(shù)量來對比看,確實是簡潔一些。

討論

這個提案引起了社區(qū)不小的轟動和討論,有多種不同的觀點。

語法格式

先從 Go 的語法角度來看。語法格式為:

[ Identifier ] | "(" IdentifierList ")" "=>" ExpressionList

例子會變成:

s.Write(ctx, p => p.SetData([]byte("Hello, "))

g.Go(=> nil)

更更更短了。

降低了可讀性

許多小伙伴認為這反而降低了代碼可讀性,更難懂了,還得在腦子里轉(zhuǎn)換幾道,才能知道是什么意思...

你想想,隨便在公司上抓一只煎魚。假設(shè)他沒有提前了解過這個語法,他能讀得懂這段代碼是什么意思嗎?

如下:

g.Go(=> nil)

顯然,他沒法 100% 確定。但沒有這語法時,只是正常的匿名閉包,是可以讀懂的。因為語法基本是通識,而箭頭語法并不是。

早期設(shè)計被拒絕

在 Go 早期的設(shè)計,其實對 “箭頭語法”,也就是本提案進行過研究。

當(dāng)時的語法是:

func f (x int) -> float32

因為它不能很好地處理多個(非元組)返回值;一旦出現(xiàn) func 和參數(shù),箭頭就多余了,會變得很復(fù)雜。

雖然這么做會看起來更 “漂亮”,但 “漂亮”(就像在數(shù)學(xué)上看起來一樣)可能仍然是多余的。它看起來也像是屬于一種“不同”語言的語法。

官方也認為必須非常小心,不要為閉包創(chuàng)建特殊語法。因為現(xiàn)在 Go 所擁有的是簡單而規(guī)律的語法和邏輯。

最終放棄了添加箭頭語法的想法。

用省略符替代

從代碼示例來看,引起繁雜的主要是類型聲明和結(jié)構(gòu)。因此也有人提出使用省略符來實現(xiàn)類似效果。

如下代碼:

s.Write(ctx, func(p _) _ { return p.SetData([]byte("Hello, ")) })

這樣的好處是不需要語法改變。

總結(jié)

原提案作者的本意,可能是需要讓匿名閉包更加的簡潔,降低代碼復(fù)雜度。但其實這本質(zhì)上,節(jié)約的只是明面上的復(fù)雜度。

一旦引入這類 “箭頭” 語法,可能會更大的加劇腦子轉(zhuǎn)換的開銷。看代碼時,得想想對對,會加重底下的腦力開銷。

當(dāng)然,說不定我也是錯的。你覺得呢?是否支持 Go 新增輕量級的匿名閉包語法,也就是業(yè)內(nèi)俗稱的 “箭頭” 語法。

參考資料

[1]proposal: Go 2: Lightweight anonymous function syntax: https://github.com/golang/go/issues/21498

[2]capnproto/go-capnproto2: https://github.com/capnproto/go-capnproto2?

責(zé)任編輯:武曉燕 來源: 腦子進煎魚了
相關(guān)推薦

2014-07-16 14:28:58

nkCase Plus

2013-08-02 14:55:20

2014-08-18 15:02:03

小米MIUI

2022-11-08 08:29:43

Goslog 庫工具

2023-12-27 08:03:53

Go優(yōu)化代碼

2023-04-19 08:21:41

ChatGPT瀏覽器操作系統(tǒng)

2021-07-27 06:49:15

Final不變性Person

2022-07-27 08:56:29

Go程序多版本

2025-03-27 23:41:35

豆包搜索AI

2019-08-27 08:50:05

AndroidGoogle 移動系統(tǒng)

2009-11-17 15:07:16

PHP數(shù)組遍歷

2011-06-15 15:55:36

PHP

2012-01-12 09:46:12

程序員編程

2024-11-28 10:26:32

2022-02-14 08:04:02

Go語法糖編譯器

2019-10-31 15:13:11

Python

2020-10-19 10:25:57

ReactReact.js前端

2020-11-03 11:18:35

Go語言GoLang編程語言

2011-07-07 16:41:04

PHP

2021-09-01 18:38:59

Goselectdefault
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 自拍偷拍亚洲欧美 | 亚洲精品免费看 | 国产视频精品区 | 欧美日在线| av在线一区二区三区 | 久久久久久久久久久久久九 | 亚洲网站观看 | 成人av在线网站 | 在线视频亚洲 | 精品婷婷 | 成人在线免费网站 | av手机在线看 | 欧美亚洲国产日韩 | 91视频官网| 精品国产一区二区三区久久久久久 | 欧美啪啪 | 欧美激情视频一区二区三区在线播放 | 成人在线免费观看视频 | 国产高清精品一区二区三区 | 日韩精品免费 | 欧美成人精品一区二区男人看 | 中文字幕国产精品 | 国产免费一区二区三区 | 欧美一区二区在线 | 美女视频一区 | 国产精品欧美一区二区三区不卡 | 久久99精品国产 | 成人久久久 | 久久99精品久久久久久国产越南 | 国产成人精品免费视频大全最热 | 免费观看一级特黄欧美大片 | 91精品一区二区三区久久久久久 | 亚洲成av人影片在线观看 | 亚洲欧美日韩一区二区 | 欧美精品一区二区三区在线播放 | 久久亚洲综合 | 久久蜜桃av一区二区天堂 | 久久亚洲综合 | 97人人干 | 午夜免费电影 | 日韩一二区在线观看 |