Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • PHP

  • Golang

    • Golang语法特点总结
      • Go语言特点
      • 可见性
      • init函数和main函数
        • init函数
        • main函数
        • init函数和main函数的异同
        • 调用顺序
      • 下划线
      • 声明
        • 批量声明
        • 一次初始化多个变量
        • 短变量声明
      • iota
    • Golang内存逃逸分析
    • Golang创建临时文件
    • Golang日常开发总结
    • Golang性能分析工具pprof使用总结
    • Golang源码系列-Slice
    • Golang源码系列-sync.Map
    • Golang开发实践万字总结
  • Python

  • Javascript

  • 其他语言

  • 编程语言
  • Golang
Ravior
2019-03-10
目录

Golang语法特点总结

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语言中还支持批量变量声明:

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

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

# 一次初始化多个变量

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

# 短变量声明

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

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

注意事项:

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

# iota

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

举个例子:

const (
  n1 = iota //0
  n2        //1
  n3        //2
  n4        //3
)
1
2
3
4
5
6
#Golang
上次更新: 2022/12/01, 11:09:34
PHP Socket编程实战
Golang内存逃逸分析

← PHP Socket编程实战 Golang内存逃逸分析→

最近更新
01
常用游戏反外挂技术总结
11-27
02
Golang开发实践万字总结
11-11
03
Redis万字总结
10-30
更多文章>
Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式