1. 基本语法

1.1 变量声明(使用var关键字)

Go 语言的基本类型有:

bool
string
intint8int16int32int64
uintuint8uint16uint32uint64uintptr
byte // uint8 的别名
rune // int32 的别名 代表一个 Unicode 码
float32float64
complex64(32 位实数和虚数)、complex128(64 位实数和虚数)

变量的命名规则遵循骆驼命名法,即首个单词小写,每个新单词的首字母大写,例如:numShips 和 startDate 。

标准格式

var 变量名 变量类型

批量格式

var (
    a int
    b string
)

简短格式

名字 := 表达式

例如:i, j := 0, 1

1.2 变量的初始化

标准格式

var 变量名 类型 = 表达式

编译器推导类型的格式

var hp = 100

短变量声明并初始化

hp := 100

注意:由于使用了 :=,而不是赋值的 =,因此推导声明写法的左值变量必须是没有定义过的变量。若定义过,将会发生编译错误。

1.3 bool

布尔值并不会隐式转换为数字值 0 或 1,反之亦然。必须使用一个显式的 if 语句辅助转换:

btoi

// 如果 b 为真,btoi 返回 1;如果为假,btoi返回 0
func btoi(b bool) int {
    if b {
        return 1
    }
    return 0
}

itob

// itob 判断是否为非零。
func itob(i int) bool { return i != 0 }

1.4 string

解释字符串

用双引号括起来,其中的相关的转义字符将被替换,例如:\n

非解释字符串

用反引号「`」括起来,例如:

`This is a raw string \n`

该字符串中的 \n 会被原样输出。

1.5 类型转换

valueOfTypeB = typeB(valueOfTypeA)

1.6 指针

指针地址和指针类型

ptr := &v // v的类型为T

其中 v 代表被取地址的变量,被取地址的 v 使用 ptr 变量进行接收,ptr 的类型就为 *T,称做 T 的指针类型。* 代表指针。

从指针获取指针指向的值

在对普通变量使用 & 操作符取地址获得这个变量的指针后,可以对指针使用 * 操作,也就是指针取值。

取地址操作符 & 和取值操作符 * 是一对互补操作符,& 取出地址,* 根据地址取出地址指向的值。

* 操作符作为右值时,意义是取指针的值;作为左值时,也就是放在赋值操作符的左边时,表示 a 指向的变量。其实归纳起来,* 操作符的根本意义就是操作指针指向的变量。当操作在右值时,就是取指向变量的值;当操作在左值时,就是将值设置给指向的变量。

创建指针的另一种方法 —— new() 函数

str := new(string)
*str = "ninja"

1.7 常量

声明

const identifier [type] = value

const (
    e  = 2.7182818
    pi = 3.1415926
)

常量的值必须是能够在编译时就能够确定的;可以在其赋值表达式中涉及计算过程,但是所有用于计算的值必须在编译期间就能获得。

如果是批量声明的常量,除了第一个外其它的常量右边的初始化表达式都可以省略,如果省略初始化表达式则表示使用前面常量的初始化表达式写法,对应的常量类型也一样的。例如:

const (
    a = 1
    b
    c = 2
    d
)
fmt.Println(a, b, c, d) // "1 1 2 2"

1.8 枚举

type Weekday int

const (
    Sunday Weekday = iota// 0
    Monday               // 1
    Tuesday              // 2
    Wednesday
    Thursday
    Friday
    Saturday
)

const (
    FlagNone = 1 << iota // 1
    FlagRed              // 2
    FlagGreen            // 4
    FlagBlue             // 8
)

func (weekDay Weekday) String() string {// 将枚举值转换为字符串
    switch weekDay {
    case Sunday:
        return "Sunday"
    ...
    }
    return "N/A"
}

1.9 type 关键字(类型别名)

区分类型别名与类型定义

type TypeAlias = Type// 类型别名,编译完成时,不会有 TypeAlias 类型
type TypeAlias Type  // 类型定义

results matching ""

    No results matching ""