概述

  • 参考
    • 《刘丹冰 Aceld》

gloang的特性

  1. 极简的部署方式,依赖极少;可以直接编译成机器码。
  2. 静态类型的语言
  3. 语言层面支持并发
  4. 强大的标准库
  5. 面向对象
  6. 跨平台

缺点

  1. 包管理不好,大部分包都在GitHub上面
  2. 所有的Exception都用Error来处理

基础语法

Hello World

入口文件的package必须是main,与文件名无关。

  • golang中的分号是可选的,建议不加
  • 不允许声明不使用的变量,引用不使用的包
  • 方法体的花括号强制要求和方法名在同一行
1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("Hello, World")
}

变量的声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 方法一:默认值是0
var age int

// 方法二:赋初始值
var age int = 18

// 方法三:类型推断
var age = 100;

// 查看变量类型
fmt.Printf("age type is %T", age)

// 方法四:省略var关键字
age := 18
  • 方法四不能用于全局变量的声明,只能在方法体内部使用
  • 可以在一行声明多个变量

常量的声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const age int = 18

// 在枚举中使用iota,iota每行都会加1(相当于游标)
const (
CAT = 10 * iota
DOG
)

func main() {
fmt.Printf("刚满%d岁\n", age)
fmt.Printf("猫猫刚满%d岁\n", CAT)
fmt.Printf("狗狗刚满%d岁\n", DOG)
}

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func func0(name string) string {
return name
}

func func1() (string, int) {
return "equator", 18
}

func func2() (name string, age int) {
name = "jetty"
age = 20
return
}

func main() {
fmt.Println("hi", func0("equator"))

name, age := func1()
fmt.Println(name, "刚满", age, "岁")

n, a := func2()
fmt.Println(n, "刚满", a, "岁")
}
  • public方法首字母必须大写

模块化

  • 每个文件实际上有个init方法,可以做一些初始化操作
  • 包的导入
1
2
3
4
5
import {
"project/folder1/lib1"
_ "project/folder1/lib2" // 匿名导入,仅执行init方法
. "project/folder1/lib2" // 全局导入
}