frame中src怎么設置成一個變量_Go 語言設計哲學之七:變量聲明須一致

Go 語言,使用變量之前需要先進行變量的聲明。

var s string = “Golang"n := 666

Go 語言有兩類變量

? ? ? ? 包級別(package varible):在 package 級別可見的變量。如果是導出變量,該變量也可以被視為全局變量;

? ? ? ? 局部變量(local varible):函數或方法體內聲明的變量,僅在函數或方法體內可見。

1. 包級別變量

包級變量使用var 關鍵字的變量聲明形式,從變量聲明的時候是否延遲初始化這個角度對包級變量進行一次分類。

1). 聲明并同時顯式初始化

//$GOROOT/src/io/pipe.govar ErrClosedPipe = errors.New("io: read/write on closed pipe")//$GOROOT/src/io/io.govar EOF = errors.New("EOF”)

上面,對于變量聲明的同時進行顯式初始化的這類包級變量,格式:

? ? ? ? ????var 變量名 = 初始化表達式

編譯器會自動根據等號右側 初始化表達式 結果值的類型確定左側聲明的變量的類型。

var?num?=?16var pi = 3.14

?Go 會為包級變量設置默認類型,對于未顯式賦予類型的整型變量 num,編譯器會設置默認類型 int;而浮點型變量 pi 的默認類型則為 float64。如果不想使用默認類型,而是要顯式為 num 和 pi 指定類型。

var num = int32(16)var pi  = float64(3.14)

上面是默認類型和顯式指定類型兩種聲明形式,尤其是在將這些變量放在一個 var 塊中聲明時

var (  num = 17  pi = float32(3.14))

2). 延遲初始化

? ? ? ? 有時候,聲明并不立即顯式初始化的包級變量,雖然沒有顯式初始化,Go 語言也會讓這些變量擁有初始的“零值”。如果是自定義的類型,保證其零值可用是非常必要的,形式如下:

var a int32var f float64

3). 聲明聚類與就近原則

??? Go 語言提供 var 塊用于將多于一個的變量聲明放在一起,我們習慣:

??????? 1 將同一類的變量聲明放在一個 var 塊中,不同類的聲明放在不同的 var 塊中;

??????? 2 將延遲初始化的變量聲明放在一個 var 塊,而將聲明且顯式初始化的變量放在另一個 var 塊中。

Go 標準庫中的代碼:

// $GOROOT/src/net/http/server.govar (    bufioReaderPool   sync.Pool    bufioWriter2kPool sync.Pool    bufioWriter4kPool sync.Pool)var copyBufPool = sync.Pool{    New: func() interface{} {        b := make([]byte, 32*1024)        return &b    },}

copyBufPool 變量沒有放入 var 塊就是因為它的聲明是帶有顯式初始化的,而 var 塊中的變量聲明都是延遲初始化的

// $GOROOT/src/net/net.govar (    aLongTimeAgo = time.Unix(1, 0)    noDeadline = time.Time{}    noCancel   = (chan struct{})(nil))var threadLimit chan struct{}

threadLimit 單獨放在 var 塊外面,它是延遲初始化的變量聲明,它與以上的 var 塊中時間限制的變量也有所不同。

變量聲明最佳實踐中還有一個原則-就近原則,如果一個包級變量在包內部多處使用,放在源文件頭部聲明比較恰當直觀。

/ $GOROOT/src/net/http/request.govar ErrNoCookie = errors.New("http: named cookie not present")func (r *Request) Cookie(name string) (*Cookie, error) {    for _, c := range readCookies(r.Header, name) {        return c, nil    }    return nil, ErrNoCookie}

2. 局部變量的聲明形式

比上面的包級別變量,局部變量多了短變量聲明形式,局部變量采用最多的一種聲明形式。

對于延遲初始化的局部變量聲明,用帶有 var 的聲明形式。

// $GOROOT/src/strings/replace.gofunc (r *byteReplacer) Replace(s string) string {  var buf []byte // 延遲初始化  for i := 0; i < len(s); i++ {    b := s[i]    if r[b] != b {      if buf == nil {        buf = []byte(s)      }      buf[i] = r[b]????}  }  if buf == nil {    return s  }  return string(buf)}

????var err error? 這也是我們日常常見的聲明方式

短變量聲明形式是局部變量最常用的聲明形式,在 Go 標準庫代碼中廣泛使用。?

num?:=?17?????????????//默認類型pi?:=?float32(3.14)???//顯示轉型
// $GOROOT/src/net/net.gofunc (v *Buffers) WriteTo(w io.Writer) (n int64, err error) {    if wv, ok := w.(buffersWriter); ok {        return wv.writeBuffers(v)    }    for _, b := range *v {        nb, err := w.Write(b)        n += int64(nb)        if err != nil {            v.consume(n)            return n, err        }    }    v.consume(n)    return n, nil}

我們看到Go源代碼net中,if wv, ok := w.(buffersWriter); ok和for _, b := range *v都使用了短變量聲明形式,這也體現出“就近”原則,讓變量的作用域最小化。

設計良好的函數/方法的原則是“單一職責”,因此每個函數/方法規模都不大,很少需要應用 var 塊來聲明局部變量,如果你在聲明局部變量時遇到這種場景,那就使用 var 塊來聲明多于一個的局部變量吧。看一下Go標準庫中的源代碼是這么使用的:

// $GOROOT/src/net/dial.gofunc (r *Resolver) resolveAddrList(ctx context.Context, op, network,addr string, hint Addr) (addrList, error) {    ... ...    var (        tcp      *TCPAddr        udp      *UDPAddr        ip       *IPAddr        wildcard bool    )   ... ...}

151da7457382859656465851d708974e.png

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

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

相關文章

數據填充規則之PKCS7

程序輸入的數據全部使用Hex 十六進制的格式 IV 00000000000000000000000000000000Source(加密數據) char input_date[] {a,a,a,a,.......} Ascll編碼 需要轉16進制input_data 303030303030303030303030303030CC CC表示此位無數據注意事項&#xff1a;考慮到程序采用 PKCS…

getdevicecaps在哪個頭文件里_一招定勝負,while (true) 和 for (;;) 到底哪個更快

在JDK8u的jdk項目下做個很粗略的搜索&#xff1a;mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for (s?;s?;" . | wc -l 369mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "while (true" . | wc -l 323并沒有差多少。其次&#…

SM4 ECB加密模式 數據對比試驗論證

程序如下 開啟服務器密碼機&#xff0c;調用SM4加密函數&#xff0c;需要注意的是程序輸入的數據全部使用Hex 十六進制的格式 Key IV Data IV 00000000000000000000000000000000Source(加密數據) char input_date[] {a,a,a,a,.......} Ascll編碼 需要轉16進制input_data …

二分法查找c語言程序_C語言的那些經典程序 第十四期

戳“在看”一起來充電吧!C語言的那些經典程序 第十四期本期小C給大家帶來三個用C語言解決實際問題的典例。如果全都理解&#xff0c;相信肯定能給大家帶來收獲&#xff01;接下來讓我們看看是哪些程序吧&#xff01;1字符查找源程序&#xff1a;運行結果&#xff1a;程序分析:該…

C++ puts函數 打印字符串很方便

參考鏈接 c puts函數_在C / C 中使用puts&#xff08;&#xff09;函數_從零開始的教程世界-CSDN博客

centos網絡隔一段時間就斷_計算機網絡總結

POST跟GET的區別作用GET用于獲取資源&#xff0c;而POST用于傳輸實體參數GET的參數以字符串的格式出現在URL中&#xff0c;而POST的參數存儲在請求實體中。因為URL只支持ASCII碼&#xff0c;故GET的參數如果存在中文等字符就需要先進行編碼&#xff0c;POST參考支持標準字符集。…

C++/C++11中std::runtime_error的使用

參考鏈接 C/C11中std::runtime_error的使用_網絡資源是無限的-CSDN博客_runtimeerror

有python基礎學java_Python基礎學習篇

導讀Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。Python由Guido van Rossum于1989年底發明&#xff0c;第一個公開發行版發行于1991年。像Perl語言一樣, Python 源代碼同樣遵循 GPL(GNU General Public License)協議。一. 列表1.1 列表的介紹列表是python的…

使用wireshark抓包,本地環回測試通信數據已經通過SM4國密算法加密

具體操作 本實驗采用 本地環回測試開啟wireshark抓包工具&#xff0c;設定端口號 tcp.port 5099 &#xff08;5099為服務端對外開啟服務的端口號&#xff09;&#xff0c;不可以使用ip.addr指定ip地址&#xff0c;因為本地環回測試&#xff0c;相關信息太多&#xff0c;使用端…

public 函數_UE4精品教程 | 渲染編程(C++篇)【第三卷:從仿函數到std::function再到虛幻4Delegate】...

本文轉載于YivanLee知乎作者專題目錄鏈接&#xff1a;https://zhuanlan.zhihu.com/p/67694999這幾天研究了一下虛幻4的delegate&#xff0c;但是想要理解這個&#xff0c;還得從仿函數說起。下面是一段代碼例子&#xff1a;class MyFunctor{ public: int operator()(int …

C語言深度剖析書籍學習記錄 第一章 關鍵字

C語言標準定義了32個關鍵字 union聲明聯合數據類型 Union declaration - cppreference.com維護足夠的空間來置放多個數據成員中的“一種”&#xff0c;而不是為每一個數據成員配置空間&#xff0c;在 union 中所有的數據成員共用一個空間&#xff0c;同一時間只能儲存其中一個…

js頁面自適應屏幕大小_移動端自適應布局方法的calc()與vw

前端人員在處理移動端自適應布局時&#xff0c;目前前端最流行的方法應該就是使用媒體查詢&#xff0c;來設置HTML的字體大小&#xff0c;然后用rem為單位對Dom的寬高進行設置&#xff0c;這個方法的優勢在于兼容性方面很好&#xff0c;劣勢則在于當前市場上不同的機型太多&…

C語言深度剖析書籍學習記錄 第二章 符號

\ 連接符號&#xff0c;// \ 可以把下一行也注釋調編譯器 刪除注釋時&#xff0c;會使用空格進行替代

詳細描述三個適于瀑布模型的項目_IT項目管理筆記——方法選擇和軟件評估

一、管理需求為什么要管理需求&#xff1f;避免失敗&#xff0c;提高項目的成功率和需求管理所帶來的其他好處軟件生命周期中&#xff0c;一個錯誤發現得越晚&#xff0c;修復錯誤的費用越高許多錯誤是潛伏的&#xff0c;并且在錯誤產生后很長一段時間才被檢查出來在需求階段&a…

Socket通信 客戶端加密數據,傳遞數據密文到服務端,服務端解密密文 輸出明文

server // sdf_cpp_warpper.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。 // server端#ifndef UNICODE #define UNICODE #endif#define WIN32_LEAN_AND_MEAN#include <iostream> #include <string> #include <sstream> #include …

主進程中發生了一個javascript錯誤_知道html5 Web Worker標準嗎?能實現JavaScript的多線程?

js為什么是單線程&#xff1f;主要是因為最開始javascript是單純的服務于瀏覽器的一種腳步語言(那時候沒有nodejs)。瀏覽器是為了渲染網頁&#xff0c;通過dom與用戶交互&#xff0c;如果一個線程需要給dom執行click事件&#xff0c;而另一個進程要刪除這個dom&#xff0c;這2個…

C語言深度剖析書籍學習記錄 第三章 預處理

宏 _LINE_ 表示正在編譯的文件的行號_FILE_ 表示正在編譯的文件的名字_DATE_ 表示編譯時刻的日期字符串&#xff0c;例如: "25 Dec 2007"_TIME_ 表示編譯時刻的時間字符串&#xff0c;例如: "12:30:55"_STDC_ 判斷該文件是不是定義成標準 C 程序宏名的書寫…

js正則限制字符串長度_正則筆記(3)萬字長文,慎點。

正則講了很久&#xff0c;也拖了很久&#xff0c;今天看看怎么用吧&#xff0c;后續更文應該會比較準勤快了。:-)書接上文【正則筆記(2)】。這次我們來看看正則的使用&#xff1a;(注&#xff1a;斜體表示為對應規則寫出的正則表達式)一、 常用的正則表達式&#xff1a;1. 驗證…

C語言深度剖析書籍學習記錄 第四章 指針和數組

p 稱為指針變量,p 里存儲的內存地址處的內存稱為 p 所指向的內存。 指針變量 p 里存儲的任何數據都將被當作地址來處理一個基本的數據類型(包括結構體等自定義類型)加上“*” 號就構成了一個指針類型的模子。這個模子的大小是一定的&#xff0c;與“*”號前面的數據類型無 關。…

js中select下拉框重置_如何利用CSS3制作炫酷的下拉框

很多小伙伴都不清楚CSS3是做什么&#xff1f;用途是什么&#xff1f;接下來我就給展示一個css3制作一個炫酷下拉框。其實不只是這些&#xff0c;還有很多。CSS3是CSS(層疊樣式表)技術的升級版本&#xff0c;于1999年開始制訂&#xff0c;2001年5月23日W3C完成了CSS3的工作草案&…