golang简介
golang是由Googgle公司开发的一种编译型的开源编程语言。相较于java,golang语言的优势是它对高并非场景的高效支持。并且做为一种新生代语言,它结合了C语言的高效性和Python语言的简洁性,可以让初学者快速上手并写出高性能的代码。
Golang的环境配置
Go的下载地址,建议走国内镜像studygolang.com/dl
关于Go的集成开发环境,这里推荐使用vscode,vscode虽然本体是一个文本编辑器,但强大的扩展性与完备的插件生态可以将它组装成任意语言的IDE,高效且强大。 对于Go语言,只安装如下一个插件即可:
Golang基础语法
Golang的语法与主流语言相似,这里着重介绍golang中特有的语法
变量声明的类型后置
与大多数语言不同的是golang中的类型都倾向于后置 如通过var声明变量
var str string // 声明单个变量
var a1, a2, a3 int // 声明多个同类型变量
声明变量且赋值
// 声明单个变量并赋值
var s1 string = "fly"
var s2 = "me"
s3 := "moon"
声明多个同类型变量并赋值
var n1, n2, n3 int = 10, 20, 30
var n4, n5, n6 = 10, 20, 30
n7, n8, n9 := 10, 20, 30
其中go不能用:变量名 := 表达式的方式声明全局变量。 声明全局变量通常使用这种形式
var (s1 string = "fly"
n1 int = 1
s2 = "me"
n2 = 10 // 类型可以省略 )
切片
切片是Go语言中的一种特殊的结构体
type slice struct {
array unsafe.Pointer
len int
cap int
}
array指向一块连续的内存空间,cap表示这块内存的大小,len表示目前该内存里存储了多少元素。
常见的创建切屏的方式
//1.声明切片
var s1 []int
s2 := []int{}
slice := make([]int,3,5)//长度为3,容量为5
var s3 []int = make([]int, 0)
// 4.初始化赋值
var s4 []int = make([]int, 0, 0)
s5 := []int{1, 2, 3}
// 5.从数组切片
arr := [5]int{1, 2, 3, 4, 5}
var s6 []int
// 前包后不包
s6 = arr[1:4]
切片的使用方式很像Python中的数组。
Golang中的循环语句
Go语言化繁为简,将所有的循环都由for语句来表达 其基本格式:
for 初始语句; 条件表达式; 结束语句 {
循环体语句
}
举例
arr := []int{1, 2, 3, 4, 5}
for i := 0; i < len(arr); i++ { // 正序遍历切片
fmt.Printf("%d: %d\n", i, arr[i])
}
在大学的编译原理一课中,我们了解到不同的结构的循环语句总能通过编译器将其转换为结构相同的汇编,猜想这也是Go仅提供一种循环语句就可满足绝大部分的业务场景使用的重要理论依据之一。
函数
由于类型后置,Go中的函数也有所改变
func 函数名(参数) (返回值) {
函数体
}
在Go中也可以很容易实现单函数返回多个值的操作 ,其返回值可以用变量或_(表示占位符)接收
func calculate(x, y int) (int, int) {
sum := x + y
sub := x - y
return sum, sub
}
func main() {
// s := make([]int, 2)
// s = calculate(1, 2)
x, _ := calculate(1, 2)
fmt.println(x)
}
匿名函数和闭包
匿名函数
func(参数) (返回值) {
函数体
}()
匿名函数多用于函数回调和闭包,因为匿名函数没有函数名因此它需要立即执行或在其后加上(参数)来保存其运行时所需的参数
闭包
闭包是一个函数内部的函数,也可以理解为:闭包=函数+引用环境
package main import "fmt"
func adder() func(int) int
{
var x int
return func(y int) int { x += y return x } } func main()
{ var f = adder()
fmt.Println(f(1)) // 1
fmt.Println(f(2)) // 3
fmt.Println(f(3)) // 6
f1 := adder()
fmt.Println(f1(4)) // 4
fmt.Println(f1(5)) // 9
}
}
只要f没有被销毁,其中的x变量将会得到保持。
异常处理
Golang中没有传统的try catch语句,因其函数可以比较简单的返回多个参数,所以Go十分推崇使用简单的error返回,如:
func divide(a, b int) (int, error)
{
if b == 0 {
return -1, errors.New("exception for b is zero")
}
return a / b, nil
}
func main() {
res, err := divide(3, 0);
if err != nil {
// exception
fmt.Println(err.Error())
}
fmt.Println(res) }
}