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.mzph.cn/news/446146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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;程序分析:该…

centos网络隔一段时间就断_计算机网络总结

POST跟GET的区别作用GET用于获取资源&#xff0c;而POST用于传输实体参数GET的参数以字符串的格式出现在URL中&#xff0c;而POST的参数存储在请求实体中。因为URL只支持ASCII码&#xff0c;故GET的参数如果存在中文等字符就需要先进行编码&#xff0c;POST参考支持标准字符集。…

使用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的工作草案&…

select选择框必输校验_轮子这么多,我们为什么选择自研NewSQL

作者介绍李鑫&#xff0c;滴滴资深软件开发工程师&#xff0c;多年分布式存储领域设计及开发经验。曾参与NoSQL/NewSQL数据库Fusion、分布式时序数据库sentry、NewSQL数据库SDB等系统的设计开发工作。一、背景Fusion-NewSQL是由滴滴自研的在分布式KV存储基础上构建的NewSQL存储…

C语言深度剖析书籍学习记录 第五章 内存管理

常见的内存错误 定义了指针变量&#xff0c;但是没有为指针分配内存&#xff0c;即指针没有指向一块合法的内存。 结构体成员指针未初始化 很多初学者犯了这个错误还不知道是怎么回事。这里定义了结构体变量 stu&#xff0c;但是他没 想到这个结构体内部 char *name 这成员在定…

怎么改电脑网络ip地址_抛弃重启路由器获取ip地址方式,巧妙运用ip代理改IP工具...

网络是简单的也是复杂的&#xff0c;在如此庞大的网络世界里有太多的不确定因素&#xff0c;导致我们遇到IP限制问题&#xff0c;从而影响到我们的网络访问&#xff0c;而大家都知道&#xff0c;如果遇到ip被限制的问题&#xff0c;最快速直接的办法就是把被限制的ip更换一个新…

C语言深度剖析书籍学习记录 第六章 函数

函数的好处 1、降低复杂性:使用函数的最首要原因是为了降低程序的复杂性&#xff0c;可以使用函数来隐含信息&#xff0c;从而使你不必再考虑这些信息。2、避免重复代码段:如果在两个不同函数中的代码很相似&#xff0c;这往往意味着分解工作有误。这时&#xff0c;应该把两个…