title: Golang学习笔记(二)
date: 2019-05-20 21:55:33
tags:
基本语法
可以从以下程序介绍一个go程序的运行规则
package main
import(
"log"
"os"
_ "github.com/goinaction/code/chapter2/sample/matchers"
)
func init(){
os.set();
log.SetOutput(os.Stdout);
}
func main(){
serarch.Run("president")
}
package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。这跟java语法相似。不同的是在java中,main函数是默认的程序入口。
import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。如import中第三个包所示,“_”指的是让go语言对包做初始化操作,但是并不使用包里的标识符。
func main() 是程序开始执行的函数。main函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)
第三方包必须写清楚完整的路径如包三,与第三方包不同,从标准库中导入代码时,只需要给出要导入的包名。编译器查找包的时候,总是会到 GOROOT 和 GOPATH 环境变量引用的位置去查找。在程序内部,变量没有定义在任何函数作用域内,会被当成包级变量。
函数
make(map[string]Matcher)
map 是 Go 语言里的一个引用类型,需要使用 make 来构造。map的作用是如果值存在,会返回这个值的副本,如果这个值不存在,会返回这个值对应类型的空值。
feeds, err := RetrieveFeeds()
if err != nil {
log.Fatal(err)
}
results := make(chan *Result)
在 Go 语言中,所有变量都被初始化为其零值/nil。且允许一个函数返回多个值,像 RetrieveFeeds 函数这
样声明一个函数返回一个值和一个错误值。
使用内置的make函数创建一个无缓冲的通道(关于通道的概念,上篇已经说明,这里想到java的GUI的实现就是用到了管道进行消息传输)。在调用 make 的同时声明并初始化该通道变量。
如果需要声明初始值为零值的变量,应该使用 var 关键字声明变量。var关键字类似于js中,如果不加var,变量就会被声明为全局变量。
for _, feed := range feeds {
这里的下划线标识符的作用是占位符,占据了保存 range 调用返回的索引值的变量的位置。也就是把不需要的返回值忽略掉,之上说过,go允许函数返回两个变量。关键字 range 可以用于迭代数组、字符串、切片、映射和通道。
一个 goroutine 是一个独立于其他函数运行的函数。使用关键字 go 启动一个 goroutine,并做并发调度
go func(matcher Matcher, feed *Feed) {
}
这里使用了go启用了一个匿名函数,甚至于匿名函数里还可以传入参数,这样可以并发地独立处理每个数据源的数据。变量 feed 是一个指针变量。指针变量可以方便地在函数之间共享数据。指针变量可以在别的函数或者其他作用域声明,他可以在函数中作为共享数据,可以被修改。
在go语言中,所有变量都是以值的方式传递,因为指针变量传递的是地址值,所以也是以值的方式传递。
go语言支持闭包。因为有了闭包,函数可以直接访问到那些没有直接作为参数传入的变量。闭包的概念可以简单理解为能够读取其他函数内部变量的函数,且存在内存中。
Go 编译器可以根据赋值运算符右边的值来推导类型,声明常量的时候不需要指定类型。
最佳实践
将方法的接收者声明为指针,因为大部分方法在被调用后都需要维护接收者的值的状态。但是如果是通过接口类型调用方法时候是需要做出改变的。当接口类型为指针时候,接受者可以声明为指针。当接口类型为值时候,接受者方法为指针是不可以调用。当接受者方法为值时候,无论借口类型为何,都可以被调用。
有疑问加站长微信联系(非本文作者)