Go语言特点总结

Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程。可以将 goroutine 理解为一种虚拟线程。Go语言运行时(runtime)会参与调度 goroutine,并将 goroutine 合理地分配到每个CPU 中,最大限度地使用CPU性能。开启一个goroutine的消耗非常小(大约2KB的内存),你可以轻松创建数百万个goroutine

goroutine的特点:

  • goroutine具有可增长的分段堆栈。这意味着它们只在需要时才会使用更多内存。
  • goroutine的启动时间比线程快。
  • goroutine原生支持利用channel安全地进行通信。
  • goroutine共享数据结构时无需使用互斥锁。

Go语言特点

  • 没有继承,多态,类等
  • 并发编程,语法层支持并发,和拥有同步并发的channel类型
  • 函数多返回值
  • 反射

可见性

  • 声明在函数内部,是函数的本地值,类似private
  • 声明在函数外部,是对当前包可见(包内所有.go文件都可见)的全局值,类似protect
  • 声明在函数外部且首字母大写是所有包可见的全局值,类似public

init函数和main函数

init函数

go语言中init函数用于包(package)的初始化。

main函数

Go语言程序的默认入口函数(主函数)

init函数和main函数的异同

相同点

  • 两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。

不同点

  • init可以应用于任意包中,且可以重复定义多个。
  • main函数只能用于main包中,且只能定义一个。

调用顺序

对同一个go文件的init()调用顺序是从上到下的。

对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数。

对于不同的package,如果不相互依赖的话,按照main包中”先import的后调用”的顺序调用其包中的init(),如果package存在依赖,则先调用最早被依赖的package中的init(),最后调用main函数。

如果init函数中使用了println()或者print()你会发现在执行过程中这两个不会按照你想象中的顺序执行。这两个函数官方只推荐在测试环境中使用,对于正式环境不要使用。

下划线

  • “_”是特殊标识符,用来忽略结果。
  • import 下划线(如:import _hello/imp)的作用:当导入一个包时,该包下的文件里所有init()函数都会被执行,然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行init()函数而已。这个时候就可以使用 import _引用该包。

声明

有四种声明方式:

  • var(声明变量)
  • const(声明常量)
  • type(声明类型)
  • func(声明函数)

批量声明

每声明一个变量就需要写var关键字会比较繁琐,go语言中还支持批量变量声明:

1
2
3
4
5
6
var (
a string
b int
c bool
d float32
)

Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 布尔型变量默认为false。 切片、函数、指针变量的默认为nil

一次初始化多个变量

1
var name, sex = "pprof.cn", 1

短变量声明

在函数内部,可以使用更简略的 := 方式声明并初始化变量。

1
2
3
4
5
6
7
8
9
10
11
package main
import (
"fmt"
)
// 全局变量m
var m = 100
func main() {
n := 10
m := 200 // 此处声明局部变量m
fmt.Println(m, n)
}

注意事项:

  • 函数外的每个语句都必须以关键字开始(var、const、func等)
  • :=不能使用在函数外。
  • _多用于占位,表示忽略值。

iota

iotago语言的常量计数器,只能在常量的表达式中使用。 iotaconst关键字出现时将被重置为0const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用。

举个例子:

1
2
3
4
5
6
const (
n1 = iota //0
n2 //1
n3 //2
n4 //3
)
有用就打赏一下作者吧!