go语言进阶
跟随昨天的学习,今天我将继续学习函数,方法的使用,并发的概念以及使用golang编译器完成程序的测试.
函数
函数是一个具有特殊的功能并可以在合理作用域中调用的代码块.与其他语言一样.go语言中函数由函数声明和函数体构成.函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。如果一组形参或返回值有相同的类型,我们不必为每个形参都写出参数类型.
函数自身调用叫做递归,有时候合理使用递归可以大大减少编码量.
go语言最大的特点之一就是一个函数中可以返回多个值.这样我们就不需要一个指针或一个引用包中多返回值而是显示的将一组值分配给变量.
我将以一个fmt.printf()函数为例子讲解可变参数
go语言中可变参数的表现形式是最后一个参数类型之前加上省略符号"..."表示函数可以接受任意数量的该类型参数
方法
在函数名前加一个变量,称之为接受器.它和Java面向对象中的this一样,表示一个隐藏的类对象调用成员方法.使用方法编程更有利于项目编写,完成多个类的调用,合理利用类之间的关系.
所以我认为go语言与java不同的一点是go语言直接使用接收器将实体类与其他方法绑定,而Java需要使用继承,封装,多态的方式描述类与类,方法与方法的关系.
并发
并发是指可以在多CPU核心的机子上同时处理不同的任务,优化资源的使用率. go语言的并发主要用于解决并发clock服务和并发Echo服务,它主要使用了goroutine和channels两个类模拟并发的并发主体和通信机制,完成web并发操作 并发设计中还需要考虑死锁,并发多路复用,线程同步和互斥问题.接下来我使用一个fibnocci问题显示并发体的设计.
`/**
该程序用于使用并发程序描述Fibonacci问题,并延时计算
*/
package main
import (
"fmt"
"time"
)
func main() {
go spinner(100 * time.Millisecond)
const n = 45
finbN := fib(n) //slow
fmt.Printf("The Fibonacci number %d is %d \n ", n, finbN)
}
func spinner(delay time.Duration) {
for {
for _, r := range -\|/ {
fmt.Printf("\r%c", r)
time.Sleep(delay)
}
}
}
func fib(x int) int {
if x < 2 {
return x
}
return fib(x-1) + fib(x-2)
}`
今天,我们完成了并发程序的简单认识,未完成的工作有go语言项目测试.明天一定会完成.