for a := 0 ; a<10 ; a++ { // go语言的循环 } // for二边的括号被去掉,int声明被简化为:=,直接通过编译器右值推导获得a的变量类型并声明 // 同样if语句也是 go语言无需添加表达式的括号 if(表达式){
}
if 表达式 {
} // go语言中,左括号必须紧接着语句不换行,其他样式的括号被视为代码编译错误,这个特性刚开始会使开发者有一些不习惯,但随着对go语言的不断熟悉,开发者就会发现风格统一让大家在阅读代码时把注意力集中到了解决问题上 而不是代码风格上
// c语言的前置++和后置++ int a, b a = i++; //执行程序第一次是本身的数 执行第二次加1 b = ++i; //执行程序第一次就开始加1
// 在go语言中,自增操作符不再是一个操作符,而是一个语句。因此,在go语言中自增只有一种写法 i++ // 如果写成前置自增++i ,或者赋值后自增 a=i++ 都将导致编译错误
/* 目前golang具有二种编译器 一种是建立在GCC基础上的Gccgo 另外一种是分别针对64位和32位计算机的一套编译器(6g和8g) 依赖方面由于go语言大多数第三方开源库都在github上 在代码的import中加上对应的github路径就可以使用了 库会默认下载到工程的pkg目录下 另外,编译时会默认检查代码中所有实体的使用情况 凡是没有使用到的package或变量,都会编译不通过 */
/* 异常处理 go语言不支持try catch结构化的异常解决方式,因为觉得会增加代码量,而且会被滥用,不管多小的异常都会抛出 3个重要关键字defer,panic,recover defer是函数结束后执行,呈先进后出 panic是程序出现无法修复的错误时使用,但会让defer执行完; recover会修复错误,不至于程序终止,当不确定函数不会出粗时使用defer+recover go语言如果是普通异常查看被调用方返回error对象 如果是严重异常指的是中断性panic(比如除0)使用defer,recover,panic机制来捕获处理 严重异常一般由go语言内部自动抛出 不需要用户主动抛出,避免传统try catch写得到处都是的情况 */
/* 网络编程 socket用net.Dial(基于tcp/udp,封装了传统的connect,listen,accept等接口) http用http.Get/Post() rec用client.Call('class_name.method_name',args,&reply) 因此它天生具备了去中心化,分布式等特性,具体表现之一就是提供了丰富便捷的网路编程接口 在go语言中还有一个重要的能力就是自带高性能HttpServer 通过简单的几行代码就可以得到一个基于协程的高性能web服务 更重要的是,维护成本极低,没有任何依赖 */
/* 函数多返回值 允许函数返回多个值,在某些场景下,可以有效的简化编程 go语言推荐的编程风格,是函数返回的最后一个参数为error类型(只要逻辑体中可能出现异常),这样,在语言级别支持多返回值,就很有必要了
语言交互性 语言交互性指的是本语言是否能和其他语言交互,比如可以调用其他语言编译的库 go可以和c程序交互 */
/* 其他一些有趣的特性 类型推导 : 在定义变量的时候是支持var abc = 10这样的语法 让go语言看上去有点像动态类型语言 但go语言实际上是强类型语言
接口interface:一个类型只要实现了某个interface的所有方法,既可实现该interface,无需显示去继承,go编程规范推荐每个interface只提供一到二个的方法,这样使得每个接口的目的非常清晰
defer机制 :在go语言中提供关键字defer可以通过该关键字指定需要延迟执行的逻辑体,也就是说,在函数体return前或出现panic时执行,这种机制非常适合善后逻辑处理,比如可以尽早避免可能出现的资源泄露问题,可以说defer是继goroutine和channel之后,另一个非常重要,实用的语言特性,对defer的引入,在很大程度上可以简化编程
“包”的概念:和python一样,把相同功能的代码放到一个目录,称之为“包”,包可以被其他包引用,main包是用来生成可执行文件,每个程序只有一个main包,包的主要用途是提高代码的可复用性,通过import可以引入其他包
交叉编译:比如说你可以再运行Linux系统的计算机上 开发运行Windows下运行的应用程序,这是第一门完全支持utf-8的编程语言,它不仅可以处理utf-8编码的字符串,就连它的源码格式都是使用的utf-8编码 */
package main //标记当前文件为main包,main包也是go程序的入口包 //导入 net/http包,这个包的作用是HTTP的基础封装和访问 import( "net/http" ) // 程序执行的入口函数 main() func main(){ // 使用http.FileServer 文件服务器将当前目录作为根目录(/目录)的处理器,访问根目录,就会进入当前目录 http.Handle("/", http.FileServer(http.Dir("."))) // 默认的HTTp服务侦听在本机的8080端口 http.ListenAndServer(":8080",nil) } // 把这个源码保存为main.go,安装go语言的开发包(后续我们会讲解如何安装),在命令行输入一下命令 go run main.go // go语言的源码无需头文件,编译的文件都来自于后缀名为.go的源码文件