Go语言以“包”作为管理单位,每个 Go 源文件必须声明它所属的包,所以我们会看到每个 Go 源文件的开头都是一个 package 声明

package main    // 声明 main 包,main 包是 Go 语言程序的入口包,一个 Go 语言程序必须有且仅有一个 main 包。如果一个程序没有 main 包,那么编译时将会出错,无法生成可执行文件。

import "fmt"       // 导入 fmt 包,导入的包中不能含有代码中没有使用到的包,否则Go编译器会报编译错误

func main() {   // 声明 main 主函数,main 函数只能声明在 main 包中,不能声明在其他包中,并且,一个 main 包中也必须有且仅有一个 main 函数。Go语言函数的左大括号{必须和函数名称在同一行,否则会报错。
    fmt.Println("Hello World!") // 打印 Hello World!
}

Go 语言基本数据类型

boolstringuint8uint16uint32uint64int8int16int32int64uintptrintuintbyterunefloat32float64complex64complex128

大多数情况下,我们只需要 int 一种整型即可,它可以用于循环计数器(for 循环中控制循环次数的变量)、数组和切片的索引,以及任何通用目的的整型运算符,通常 int 类型的处理速度也是最快的。

byte 和 rune 可以表示字符类型

var b byte = 'a'
fmt.Println(b) // 97

Go语言中不允许将布尔型强制转换为整型,编译会报错

var n bool
fmt.Println(int(n))
// cannot convert n (type bool) to type int

变量的声明

使用 var 关键字(函数内外都可使用)

1. var a, b int
2. var a, b string = "hello", "world" // 字符串不能用单引号,可以不提供变量类型
3. var (
    a int,
    b string,
    c bool = true,
    d = "hi"
)
4. str := `this is another
string`

使用 := 方式声明(仅函数内部可用)
使用 := 声明变量不能提供数据类型

1. a := 1
2. a, b := 2, "hi" // 同时声明并赋值多个变量

Go语言中没有隐式转换,只能强制转换,const 定义常量没有指定数据类型时可以隐式的转换数据类型

package main

import "fmt"

func sum(a float32, b float32) float32{
    return a + b
}

func main(){
    // var m, n = 1.1, 2 // 报错
    const m, n = 1.1, 2 // 正常
    fmt.Println(sum(m, n))
}

常量

const Pi = 3.14159

在 Go 语言中,你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。

const b string = "abc"const b = "abc"

数字型的常量是没有大小和符号的,并且可以使用任何精度而不会导致溢出

并行赋值

const beef, two, c = "eat", 2, "veg"
const Monday, Tuesday, Wednesday, Thursday, Friday, Saturday = 1, 2, 3, 4, 5, 6
const (
    Monday, Tuesday, Wednesday = 1, 2, 3
    Thursday, Friday, Saturday = 4, 5, 6
)

指针

&
package main

import "fmt"

func main(){
    str := "指针"
    fmt.Println(&str) // 0xc0000501f0
    fmt.Printf("%T", &str) // *string
}
&*
package main

import "fmt"

func main(){
    str := "PHP is the best language in the world!"

    ptr := &str

    value := *ptr

    // 打印ptr的类型
    fmt.Printf("ptr type: %T\n", ptr) // ptr type: *string

    // 打印ptr的指针地址
    fmt.Printf("address: %p\n", ptr) // address: 0xc0000661e0

    // 取值后的类型
    fmt.Printf("value type: %T\n", value) // value type: string

    // 指针取值后就是指向变量的值
    fmt.Printf("value: %s\n", value) //value: PHP is the best language in the world!
}
*

使用指针修改值

package main

import "fmt"

func swap(a, b *int) {
    *a, *b = *b, *a
}

func main(){
    a, b := 1, 2
    fmt.Println(a, b) // 1 2
    swap(&a, &b)
    fmt.Println(a, b) // 2 1
}

创建指针的另一种方法 — new()函数
Go语言还提供了另外一种方法来创建指针变量,方法如下:

str := new(string)
*str = "PHP is the best language in the world!"
fmt.Println(*str) // PHP is the best language in the world!

类型别名与类型定义

type TypeAlias = Type
package main
import "fmt"

type IntAlias = int

func main() {
    var a, b IntAlias = 3, 4
    c := a + b
    fmt.Printf("c has the value: %d", c) // 输出:c has the value: 7
}
type NewType Type
package main

import "fmt"

//类型定义
type NewInt int

//类型别名
type AliasInt = int

func main() {
    var a NewInt
    var b AliasInt

    fmt.Printf("type ocf a:%T\n", a) //type of a:main.NewInt
    fmt.Printf("type of b:%T\n", b) //type of b:int
}
// 区别:结果显示a的类型是main.NewInt,表示main包下定义的NewInt类型。b的类型是int。AliasInt类型只会在代码中存在,编译完成时并不会有AliasInt类型。