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

為什么 Go 不支持函數(shù)重載和缺省參數(shù)?

開發(fā) 后端
部分同學在初學習 Go 語言時,帶著其他語言的習慣,總是會有些不習慣,感覺非常不能理解,直打問號。

[[433808]]

文末本文轉(zhuǎn)載自微信公眾號「腦子進煎魚了」,作者 陳煎魚 。轉(zhuǎn)載本文請聯(lián)系腦子進煎魚了公眾號。

大家好,我是煎魚。

部分同學在初學習 Go 語言時,帶著其他語言的習慣,總是會有些不習慣,感覺非常不能理解,直打問號。

其中一點就是問到 “為什么 Go 語言不支持函數(shù)重載和缺省參數(shù)”,覺得使用起來很不方便,畢竟以前能省了定義不少東西。

為此,在這篇文章中煎魚就和大家一起來了解為什么,有又會怎么樣。

函數(shù)重載

函數(shù)重載(function overloading),也叫方法重載。是某些編程語言(如 C++、C#、Java、Swift、Kotlin 等)具有的一項特性。

該特性允許創(chuàng)建多個具有不同實現(xiàn)的同名函數(shù),對重載函數(shù)的調(diào)用會運行其適用于調(diào)用上下文的具體實現(xiàn)。

從功能上來講,就是允許一個函數(shù)調(diào)用根據(jù)上下文執(zhí)行不同的方法,達到調(diào)用同一個函數(shù)名,執(zhí)行不同的方法。

一個簡單的例子:

  1. #include <iostream> 
  2.  
  3. int Volume(int s) {  // 立方體的體積。 
  4.   return s * s * s; 
  5.  
  6. double Volume(double r, int h) {  // 圓柱體的體積。 
  7.   return 3.1415926 * r * r * static_cast<double>(h); 
  8.  
  9. long Volume(long l, int b, int h) {  // 長方體的體積。 
  10.   return l * b * h; 
  11.  
  12. int main() { 
  13.   std::cout << Volume(10); 
  14.   std::cout << Volume(2.5, 8); 
  15.   std::cout << Volume(100l, 75, 15); 

在上述例子中,實現(xiàn)了 3 個同名的 Volume 函數(shù),但是 3 個函數(shù)的入?yún)€數(shù)、類型均不一樣,也代表了不同的實現(xiàn)目的。

在主函數(shù) main 中,傳入了不同的入?yún)ⅲ幾g器或運行時再進行內(nèi)部處理,從程序上來看達到了調(diào)用不同函數(shù)的目的。

這就是函數(shù)重載,一函數(shù)多形態(tài)。

參數(shù)默認值

參數(shù)默認值,又叫缺省參數(shù)。指的是允許程序員設(shè)定缺省參數(shù)并指定默認值,當調(diào)用該函數(shù)并未指定值時,該缺省參數(shù)將為缺省值來使用。

一個簡單的例子:

  1. int my_func(int a, int b, int c=12); 

在上述例子中,函數(shù) my_func 一共有 3 個變量,分別是:a、b、c。變量 c 設(shè)置了缺省值,也就是 12。

其調(diào)用方式可以為:

  1. // 第一種調(diào)用方式 
  2. result = my_func(1, 2, 3); 
  3. // 第二種調(diào)用方式 
  4. result = my_func(1, 2); 

在第一種方式中,就會正常的傳入所有參數(shù)。在第二種方式,由于第三個參數(shù) c 并沒有傳遞,因此會直接使用缺省值 12。

這就是參數(shù)默認值,也叫缺省參數(shù)。

為什么不支持

美好

從上述的功能特性介紹來看,似乎非常的不錯,能夠節(jié)省很多功夫。像是 Go 語言的 context 庫中的這些方法:

  1. func WithCancel(parent Context) (ctx Context, cancel CancelFunc) 
  2. func WithDeadline(parent Context, d time.Time) (Context, CancelFunc) 
  3. func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) 

要是有函數(shù)重載,直接就 WithXXX 就好了,只需要關(guān)注傳入的參數(shù)類型,也不用 “記” 那么多個方法名了。

有同學說,有參數(shù)默認值。那就可以直接設(shè)置在上面,作為 “最佳實踐” 給到使用函數(shù)的人,豈不美哉。那怎么 Go 語言就不支持呢?

細思

其實這和設(shè)計理念,和對程序的理解有關(guān)系。說白了,就是你喜歡 “顯式”,還是 “隱喻”。

函數(shù)重載和參數(shù)默認值,其實是不好的行為。調(diào)用者只看函數(shù)名字,可能沒法知道,你這個默認值,又或是入?yún)⒉煌瑫{(diào)用的東西,會產(chǎn)生怎么樣的后果?

你可以觀察一下自己的行為。大部分人都會潛意識的追進去看代碼,看看會調(diào)到哪,缺省值的作用是什么,以確保可控。

敲定

這細思的可能,在 Go 語言中是不被允許的。Go 語言的設(shè)計理念就是 “顯式大于隱喻”,追求明確,顯式。

在 Go FAQ 《Why does Go not support overloading of methods and operators?》有相關(guān)的解釋。

如下圖:

官方有明確提到兩個觀點:

  • 函數(shù)重載:擁有各種同名但不同簽名的方法有時是很有用的,但在實踐中也可能是混亂和脆弱的。
  • 參數(shù)默認值:操作符重載,似乎更像是一種便利,不是絕對的要求。沒有它,程序會更簡單。

這就是為什么 Go 語言不支持的原因。

總結(jié)

在這篇文章中,我們介紹了業(yè)內(nèi)常見的編程語言的函數(shù)重載和參數(shù)默認值的概念和使用方法。也結(jié)合了 Go 語言自身的設(shè)計理念,說明了為什么不支持的原因。

你會希望 Go 語言支持這幾個特性功能嗎,歡迎在評論區(qū)留言討論和交流:)

參考

維基百科(函數(shù)重載和缺省值定義)

Frequently Asked Questions (FAQ)

 

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

2023-02-26 23:36:08

PHPGo函數(shù)

2021-12-09 10:51:47

Go繼承

2021-10-27 07:15:36

Go 循環(huán)引用

2021-12-15 07:49:22

Go語言設(shè)計

2024-03-08 08:51:59

Gomain函數(shù)

2024-01-01 08:10:40

Go語言map

2024-01-05 08:45:35

Go語言map

2024-05-28 08:55:52

2023-01-28 08:05:32

轉(zhuǎn)換Go泛型

2024-03-12 09:13:28

Go語言main

2020-07-22 08:01:41

Python開發(fā)運算符

2020-10-09 06:48:19

Pythonswitch語句

2023-04-03 11:21:29

PythonGoRust

2021-02-01 13:53:53

StringlongJava

2009-03-12 08:42:38

AndroidWMMTK

2021-06-11 00:03:31

鴻蒙智能手機

2021-08-02 09:31:20

Python工具代碼

2021-07-13 08:09:34

微博推特評論

2025-06-26 02:22:00

GoProtobuf標簽

2014-06-05 15:16:49

Linux開源Flash
點贊
收藏

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

主站蜘蛛池模板: 男女爱爱福利视频 | 久久久久久成人 | 性福视频在线观看 | 亚洲高清在线观看 | 亚洲一区视频在线播放 | 精品乱子伦一区二区三区 | 国产第一页在线观看 | 高清黄色网址 | 欧美精品99 | 成人激情视频免费在线观看 | 色婷婷av777| av在线视 | 一本久久a久久精品亚洲 | 久久久国产一区二区三区 | 一区二区片 | 日本一道本视频 | 亚洲最色网站 | 国产精品国产a | 国产亚洲一区二区三区在线 | 久久久免费观看视频 | 国产精品日日做人人爱 | 男人天堂视频在线观看 | 午夜网 | 欧美中文在线 | 国产精品日韩欧美一区二区三区 | 欧美精品中文字幕久久二区 | www.毛片| 97免费在线观看视频 | 午夜影院在线观看版 | 亚洲国产成人在线视频 | 国产精品视频久久 | 一级特黄a大片 | 一区二区av | 国产 日韩 欧美 中文 在线播放 | 日韩一级免费看 | 国产成人精品久久二区二区91 | 一区二区三区中文字幕 | 九九热精品免费 | 色又黄又爽网站www久久 | 免费在线观看av的网站 | 在线一区二区三区 |