-
GoLang 学习笔记(七)-- 声明变量风格,二级指针,隐式作用域
编辑器换成了 GoLand,看源码极其方便。就是快捷键又要适应一会儿。
今天开始看 《Go 程序设计语言》,别名《Go 语言圣经》。
$ ./goBible --type=书籍 --name=Go 语言圣经(一)--chapter=Program Structure
1. 声明变量,有四种方式
虽然 Go 一直说自己很简洁,去掉很多多余的语法。但是又舍不得语法糖,于是声明一个变量出现了 4 种用法,这里假设我们要声明一个叫 s
的 string
类型的变量:
-
var s string
-
var s = ""
-
s := ""
-
var s string = ""
语法就不讲了,非常基础的东西,这里讲一下这四种方式分别用在哪种情况: - 第一种很明显,当不需要初始化(或者说只需要零值)的时候使用。(还是提一下,Go 里没有未初始化这种说法,全部都有初始化)
- 2 和 3 其实是完全可以互相代替的。但是一般来讲,2 比较正式,用于声明一些 package-level 的变量。而 3 就比较为了图省事,一般用于函数内的一些 local 变量。
-
4 看起来显得十分多余,但是如果你需要类似于
var a float64 = 100
这种用法的时候,就有用处了。
2. 指针
指针没什么好说的,需要说的是二级指针,但是因为某种原因我写在另一篇文章里了:
我的另一篇文章。
3. 作用域
和 js 一模一样,甚至也一样可以使用无关键字的大括号。
甚至也是用的作用域链。
但不是完全没得说,因为 go 里的 for,if 等有一个隐式作用域:
for i := 0; i < 10; i++ {
fmt.Println(i)
i := 0
fmt.Println(i)
}
// 你觉得会无限循环吗?其实不会
// 总共会循环 10 次
// 第一个 print 会依次 print 0,1,2...9
// 第二个 print 会打印 10 个 0
为什么,因为 for 的初始化语句块其实也是一个作用域,你说我知道啊,和 for 里的语句在同一个作用域嘛,所以可以访问。
但是不是,这就是 go 的奇妙之处,其实整个代码类似于这样一个结构:
for {
(i := 0; i < 10; i++ )
{
fmt.Println(i)
i := 0
fmt.Println(i)
}
}
也就是说,大括号里的语句块和初始化 i 的语句块并不是在同一个作用域,而是嵌套的,所以可以使用 i,但是却不能改变外面的 i。所以这个循环必定是循环 10 次。
这个语法是好是坏见仁见智了,我有时候还是会想在内部改变 i 从而跳过几个循环的。
出处:https://www.cnblogs.com/oyishyi/p/14838151.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式