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    )   ... ...}

frame中src怎么设置成一个变量_Go 语言设计哲学之七:变量声明须一致相关推荐

  1. frame中src怎么设置成一个变量_自动格式化打印变量HMLog介绍

    作者 | mao2020 来源 | 掘金,点击阅读原文查看作者更多文章 前言 在我初学iOS的时候,经常需要NSLog打印用于调试,有时候还需要打印多个变量: NSLog(@"xxxx fr ...

  2. frame中src怎么设置成一个变量_OpenCV图像人脸检测及视频中的人脸检测(附源码)...

    文章目录 一.数据和知识准备 1. 下载HAAR与LBP数据 2. opencv相关知识 二.python+opencv实现人脸检测 1. 图像单人脸检测 2. 图像多人脸检测 3. 视频中人脸检测 ...

  3. frame中src怎么设置成一个变量_webpack中Css的处理

    摘要:这个时代对速度和性能要求越来越高,前端开发中兼容性问题是一个让人头疼的问题,也许在这台设备上明明好好的,但是换一个设备就会让人哭笑不得,对于用户体验和流量资源的开销也是要考虑的一个问题,当下我们 ...

  4. frame中src怎么设置成一个变量_在 Figma 中如何选择 group(组)或 frame(画框)?...

    导读:在 Figma 中可以使用 group(组)或 frame(画框)来组织元素,但它们又有一些不同.合理地选择如何使用它们,能够帮助我们更好地设计.本文来自 Figma 官方博客,由卓浩翻译. 你 ...

  5. @value 静态变量_C语言基本知识:变量

    变量其实只不过是程序可操作的存储区的名称.C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字和下划线字符组 ...

  6. c语言基础变量,C语言基础-第一篇-变量

    我们讨论的顺序是这样的,首先,我抛出一个问题,计算机语言究竟是什么,我们不谈什么高级语言,中级语言,低级语言,我们就说计算机语言,这个语言是我们与计算机沟通的桥梁,和人类语言一样,是两个人交流的工具, ...

  7. 安装成功配置环境变量_go语言学习笔记-Windows10开发环境安装和环境变量配置

    相关文档 go语言学习笔记-目录 1.安装 1.1.访问 https://golang.google.cn/dl/ 或 https://golang.org/dl/ 下载官方安装包 1.2.选择Win ...

  8. c语言 平方 用变量,C语言编程之《变量—用来存储数据的小房子》

    上一节咱们了解到计算机是使用一个一个的小房子来记住数字.计算机有不少不一样种类的小房子.html int a; 表明向计算机申请一个小房子用来存放数值,小房子的名字叫作a.int和a之间有一个空格,a ...

  9. Cadence Allegro PCB设计88问解析(十四) 之 Allegro中库路径设置方法

    一个学习信号完整性的layout工程师 大家在进行Layout设计时,最重要就是导入网表,放入元器件,然后进行走线.那其中的元器件就是今天和大家分享的一点,不管是阻容感,还是各种IC.连接器都是有封装 ...

最新文章

  1. 如何让 Mybatis 自动生成代码,提高开发效率
  2. 为什么说多道程序概念得到了中断和通道技术的支持?
  3. PRML-系列一之1.6
  4. VCL组件之TStrings
  5. python小课离线版_断网环境下利用pip安装Python离线安装包
  6. xhtml 1.0与html4.0区别大全
  7. 《庆余年》里的五竹,到底是不是机器人?
  8. Atitit uke协会产业分类法 艾提拉产业分类法五大类法 目录 1. 配第-克拉克定理概述 产业趋势 有形财物的生产转向无形的服务性生产 1 1.1. 农工商趋势法 1 1.2. 1940年,英
  9. eclipse neon php插件,Eclipse Neon安装Tomcat插件
  10. Android单元测试
  11. 使用nmake编译Gdal源代码(Win10, VS2022)
  12. react JSZip-压缩文件下载本地
  13. leetcode第12题Python版整数转罗马字符串
  14. Eyoucms采集-易优实时数据采集-Eyoucms自动采集
  15. 神经网络学习小记录64——Pytorch 图像处理中注意力机制的解析与代码详解
  16. TMS320C5509A 控制DDS AD9854芯片进行AM幅度调制时的FIR滤波处理
  17. 搭建gos_快速浏览gOS –但不要称其为Google
  18. 向量场的散度和旋度_矢量场,标量场,散度,梯度,旋度的理解
  19. 摇床摇篮是哄睡很好用的工具
  20. 修身修心的1000+篇文章总结

热门文章

  1. 定界符在php中,php定界符如何使用
  2. python书籍排行榜前十名_学习Python,这些书你看过几本?
  3. 【转】ABP源码分析二十五:EventBus
  4. 【转】3:C#异步WaitAll的使用
  5. 【转】使用Azure Rest API获得Access Token介绍
  6. 第十八节:跨域请求的解决方案和WebApi特有的处理方式
  7. C# async 和 await 理解
  8. 让TFS忽略packages文件夹的更改
  9. SharePoint2010开发最佳实践
  10. webstorm 内存溢出怎么弄_webstrom 内存溢出,软件崩溃卡死解决的方法