【golang】類型推斷和變量重聲明

類型推斷是一種編程語言在編譯期自動解釋表達式類型的能力。

1.Go語言的類型推斷可以帶來哪些好處?

在寫代碼時,我們通過使用Go語言的類型推斷會節省敲擊次數,而節省下來的鍵盤敲擊次數幾乎可以忽略不記。但它真正的好處,往往會體現在我們寫代碼之后的那些事情上,比如代碼重構。

我們依然通過調用一個函數在聲明name變量的同時為它賦值,但是這個函數不是flag.String,而是由我們自己定義的某個函數,比如叫getTheFlag。

package main
import ("flag""fmt"
)
func main() {var name = getTheFlag()flag.Parse()fmt.Printf("Hello, %v!\n", *name)
}
func getTheFlag() *string {return flag.String("name", "everyone", "The greeting object.")
}

我們可以用getTheFlag函數包裹(或者說包裝)那個對flag.String函數的調用,并把
其結果直接作為getTheFlag函數的結果,結果的類型是*string。

這樣一來,var name =右邊的表達式,可以變為針對getTheFlag函數的調用表達式
了。這實際上是對“聲明并賦值name變量的那行代碼”的重構

我們通常把不改變某個程序與外界的任何交互方式和規則,而只改變其內部實現”的代碼修改方式,叫做對該程序的重構。重構的對象可以是一行代碼、一個函數、一個功能模塊,甚至一個軟件系統。

你會發現,你可以隨意改變getTheFlag函數的內部實現,及其返回結果的類型,而不用修改main函數中的任何代碼。

這個命令源碼文件依然可以通過編譯,并且構建和運行也都不會有問題。也許你能感覺得到,這是一個關于程序靈活性的質變。

我們不顯式地指定變量name的類型,使得它可以被賦予任何類型的值。也就是說,變量name的類型可以在其初始化時,由其他程序動態地確定。

在你改變getTheFlag函數的結果類型之后,Go 語言的編譯器會在你再次構建該程序的時候,自動地更新變量name的類型。

Go 語言是靜態類型的,所以一旦在初始化變量時確定了它的類型,之后就不可能再改變。這就避免了在后面維護程序時的一些問題。另外,請記住,這種類型的確定是在編譯期完成的,因此不會對程序的運行效率產生任何影響。

Go語言的類型推斷可以帶來哪些好處?

回答:Go 語言的類型推斷可以明顯提升程序的靈活性,使得代碼重構變得更加容易,同時又不會給代碼的維護帶來額外負擔(實際上,它恰恰可以避免散彈式的代碼修改),更不會損失程序的運行效率。

2.變量的重聲明是什么意思?

涉及到短變量聲明。通過使用它,我們可以對同一個代碼塊中的變量進行重聲明。

在 Go 語言中,代碼塊一般就是一
個由花括號括起來的區域,里面可以包含表達式和語句。Go 語言本身以及我
們編寫的代碼共同形成了一個非常大的代碼塊,也叫全域代碼塊。
這主要體現在,只要是公開的全局變量,都可以被任何代碼所使用。相對小
一些的代碼塊是代碼包,一個代碼包可以包含許多子代碼包,所以這樣的代
碼塊也可以很大。

接下來,每個源碼文件也都是一個代碼塊,每個函數也是一個代碼塊,每個
if語句、for語句、switch語句和select語句都是一個代碼塊。甚至,
switch或select語句中的case子句也都是獨立的代碼塊。
走個極端,我就在main函數中寫一對緊挨著的花括號算不算一個代碼塊?當
然也算,這甚至還有個名詞,叫“空代碼塊”。

變量重聲明的前提條件:

  1. 由于變量的類型在其初始化時就已經確定了,所以對它再次聲明時賦予的類型必須與其
    原本的類型相同,否則會產生編譯錯誤。
  2. 變量的重聲明只可能發生在某一個代碼塊中。如果與當前的變量重名的是外層代碼塊中
    的變量,那么就是另外一種含義了。
  3. 變量的重聲明只有在使用短變量聲明時才會發生,否則也無法通過編譯。如果要在此處
    聲明全新的變量,那么就應該使用包含關鍵字var的聲明語句,但是這時就不能與同一個
    代碼塊中的任何變量有重名了 。
  4. 被“聲明并賦值”的變量必須是多個,并且其中至少有一個是新的變量。這時我們才可
    以說對其中的舊變量進行了重聲明。

這樣來看,變量重聲明其實算是一個語法糖(或者叫便利措施)。它允許我們在使用短變量
聲明時不用理會被賦值的多個變量中是否包含舊變量。可以想象,如果不這樣會多寫不少代
碼。

var err error
n, err := io.WriteString(os.Stdout, "Hello, everyone!\n")

我使用短變量聲明對新變量n和舊變量err進行了“聲明并賦值”,這時也是對后者的重聲明。

文章來自郝林老師的《Go語言36講》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39599.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39599.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39599.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小游戲掃雷實現教學(詳解)

目錄 【前言】 一、模塊化程序設計(多文件編程)介紹 1.概述 2.傳統編程的方式 3.模塊化程序設計的方法 二、掃雷代碼設計思路 三、掃雷代碼設計 1.創建菜單函數 2.實現9x9掃雷 3.初始化棋盤 4.打印棋盤 5.隨機布置雷的位置 6.排查雷的信息 7.回…

網絡安全--利用awk分析Apache日志

一、溯源 你會溯源嗎?怎么溯 拿到日志(ssh登錄日志,Apache日志),通過日志溯到ip,對日志進行每天的拆分,第二通過awk日志分析工具對每天的日志進行拆分,分析某一個ip今天對我訪問多…

如何防止DDOS攻擊與CC攻擊???

防止DDOS(分布式拒絕服務)和CC(網絡層阻斷)攻擊需要綜合采取多種措施,包括以下幾個方面: 1. 增加帶寬和資源:通過增加網絡帶寬和服務器資源,可以擴大系統的吞吐能力,從而…

TEC2083BS-PD碼轉換器(解決博世矩陣控制PELCO派爾高球機的問題)

TEC2083BS-PD碼轉換器 使用說明 1.設備概述 控制碼轉換器在安防工程中起著非常重要的角色,隨著高速球型攝像機在安防工程中大范圍的使用,而高速球廠家都因為某些原因很少使用博世、飛利浦的協議。為此,工程商經常會遇到博世協議和PELCO協議之…

linux命令readelf基本用法

readelf是一個用于顯示ELF (Executable and Linkable Format) 文件信息的工具。它可以用于顯示二進制文件、共享庫以及目標文件的各種詳細信息。 常見用法&#xff1a; 文件頭信息(32位還是64位&#xff0c;入口點的地址等): readelf -h <filename>程序頭表(運行時如何…

RabbitMQ工作流程詳解

1 生產者發送消息的流程 (1)生產者連接RabbitMQ&#xff0c;建立TCP連接(Connection)&#xff0c;開啟信道(Channel) (2)生產者聲明一個Exchange (交換器)&#xff0c;并設置相關屬性&#xff0c;比如交換器類型、是否持久化等 (3)生產者聲明一個隊列井設置相關屬性&#xf…

Spring-Cloud-Loadblancer詳細分析_3

前兩篇文章介紹了加載過程&#xff0c;本文從Feign的入口開始分析執行過程&#xff0c;還是從FeignBlockingLoadBalancerClient.execute來入手 public class FeignBlockingLoadBalancerClient implements Client {private static final Log LOG LogFactory.getLog(FeignBlock…

Vue3實現圖片懶加載及自定義懶加載指令

Vue3實現圖片懶加載及自定義懶加載指令 前言1.使用vue3-lazyload插件2.自定義v-lazy懶加載指令2.1 使用VueUse2.2 使用IntersectionObserver 前言 圖片懶加載是一種常見性能優化的方式&#xff0c;它只去加載可視區域圖片&#xff0c;而不是在網頁加載完畢后就立即加載所有圖片…

clickhouse入門

clickhouse 1 課程介紹 和hadoop無關&#xff0c;俄羅斯&#xff0c;速度快3 介紹&特點 1 列式存儲 在線分析處理。 使用sql進行查詢。列式存儲更適合查詢分析的場景。新增時候有一個尋址的過程。更容易進行壓縮行式存儲。增刪改查都需要的時候。2 DBMS功能 包括ddl,d…

集成DTM實現跨語言分布式事務V1.0

集成DTM實現跨語言分布式事務V1.0 簡介 DTM是一款開源的分布式事務管理器&#xff0c;解決跨數據庫、跨服務、跨語言棧更新數據的一致性問題。 通俗一點說&#xff0c;DTM提供跨服務事務能力&#xff0c;一組服務要么全部成功&#xff0c;要么全部回滾&#xff0c;避免只更新…

MIMO-NOMA系統MATLAB仿真實現

非正交多址接入&#xff08;NOMA&#xff09;技術可以打破傳統的正交多址一個基本資源塊由單用戶獨占的限制&#xff0c;通過在時域和頻域的基礎上開辟新的功率域維度&#xff0c;在相同的時頻資源上通過功率復用技術允許同一個時頻資源塊由多個用戶共享&#xff0c;有效提升了…

ViewPager2與TabLayout的簡單使用

ViewPager2與TabLayout的簡單使用 MainActivity.java public class MainActivity extends AppCompatActivity {private ViewPager2 mViewPager;private TabLayout mTabLayout;private int[] icons new int[]{R.drawable.icon1, R.drawable.icon2, R.drawable.icon3, R.drawa…

如何進行無線網絡滲透測試?

今天我們將繼續深入探討Kali Linux的應用&#xff0c;這次我們將重點介紹如何使用Kali Linux進行無線網絡滲透測試。無線網絡滲透測試是評估無線網絡安全性的重要步驟&#xff0c;而Kali Linux作為一款專業的滲透測試發行版&#xff0c;提供了豐富的工具來幫助你進行這項任務。…

c++中const修飾成員函數的問題

問題引入&#xff1a; 看下面這一段代碼&#xff1a; class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << "Print()" << endl;cout << "year:" << _year <&…

面試熱題(全排列)

給定一個不含重復數字的整數數組 nums &#xff0c;返回其 所有可能的全排列 。可以 按任意順序 返回答案。 輸入&#xff1a;nums [1,2,3] 輸出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 先在這里說明一下排列和組合的區別? 組合&#xff1a;是指從一…

前端三劍客

三劍客 萬維網聯盟&#xff08; World Wide Web Consortium &#xff09;&#xff0c;創建于1994年10月&#xff0c;主要工作是對 web 進行標準化。 ? 該組織定義了網頁的開發需要如下3門技術&#xff1a; ? - HTML:定義網頁的結構 - CSS: 定義網頁的表現&#xff0c;樣式 -…

開源數據庫Mysql_DBA運維實戰 (名詞解釋)

SQL&#xff08;Structured Query Language 即結構化查詢語言&#xff09; SQL語言主要用于存取數據、查詢數據、更新數據和管理關系數據庫系統&#xff0c;SQL語言由IBM開發。 SQL語言分類&#xff1a; DDL語句 數據庫定義語言&#xff1a;數據庫、表、視圖、索引、存儲過程…

Steam 靈感的游戲卡懸停效果

先看效果&#xff1a; 再看代碼&#xff08;查看更多&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Steam 靈感的游戲卡懸停效果</title><style>* {margin: …

構建高效外賣系統平臺:從需求到實現

隨著科技的不斷進步和人們生活節奏的加快&#xff0c;外賣成為了越來越多人的飲食選擇。為了滿足這一需求&#xff0c;開發一套高效的外賣系統平臺變得尤為重要。本文將從需求分析開始&#xff0c;逐步引導您了解如何開發一套完整的外賣系統平臺。 第一步&#xff1a;需求分析…

分類預測 | MATLAB實現EVO-CNN多輸入分類預測

分類預測 | MATLAB實現EVO-CNN多輸入分類預測 目錄 分類預測 | MATLAB實現EVO-CNN多輸入分類預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.MATLAB實現EVO-CNN多輸入分類預測 2.代碼說明&#xff1a;量谷優化卷積神經網絡的數據分類預測&#xff1a;要求于Matlab …