Go 语言入门指南:基础语法和常用特性解析| 青训营

150 阅读3分钟

基础语法

基本介绍(HelloWorld)

Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。

语言特色

  • 简洁、快速、安全
  • 并行、有趣、开源
  • 内存管理、数组安全、编译迅速

Go 语言用途

Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

HelloWorld

package main
import "fmt"
// main函数主要入口函数 
func main() { 
    fmt.Println("HelloWorld") 
}   

变量

Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。

1、标准定义

//var 名称 类型 
var Name string 
//var 名称 类型 = 数据 
var Name string = ""

2、类型推断

//var 名称 = 数据 
var Name = ""

3、简便定义

//只在函数中才可以定义 
//名称 := 数据 
Name := ""

4、同时定义多个变量

//var 变量名1,变量名2 = 数据1, 数据2 
var Name1, Name2 = "", "" 
// 变量名1,变量名2 := 数据1, 数据2 
Name1, Name2 := "", "" 
//var 变量名1,变量名2 数据类型 = 数据1, 数据2 
var Name1, Name2 string = "", ""

常量

1、标准定义

//const 名称 类型 = 数据 
const Name string =""

2、类型推断

//const 名称 = 数据 
const Name = ""

3、同时定义多个变量

//var 变量名1,变量名2 = 数据1, 数据2 
const Name1, Name2 = "", "" 
//var 变量名1,变量名2 数据类型 = 数据1, 数据2 
const Name1, Name2 string = "", ""

判断(ifelse)

常量是一个简单值的标识符,在程序运行时,不会被修改的量。 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。

1、普通使用

var num int 
if num > 0 { 
    //内容 
} else {
    //内容 
}

2、连续使用

var num int 
if num > 0 { 
    //内容 
} else if num == 0 {
    //内容 
}else{
    //内容 
}

循环

go中只有for循环没有其他循环

1、for{}死循环

num := 0 
for { 
    num++ 
    if num > 10 {
        break 
    } 
}

2、条件循环

num := 0 
for num < 10 { 
    num++ 
}

3、递增循环

for num := 0; num < 10; num++ { 

}

goto循环

num := 0 
LOOP:for { 
    num++ 
    if num = 10 {
        goto LOOP
    } 
}

Switch

case内的方法体中不需要添加break也可跳出Switch

1、正常使用

num := 0
switch num { 
    case 1:{ 
        fmt.Println("1") 
    } 
    case 2:{ 
        fmt.Println("2") 
    } 
    case 3: 
        fmt.Println("3") 
        fmt.Println("==") 
    case 4: 
        fmt.Println("4") 
    default: 
        fmt.Println("default") 
    }

2、代替ifelse

num := 10 
switch { 
    case num < 10: 
        println("10") 
    case num < 20: 
        println("20") 
    default: 
        println("default") 
    }

数组

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。

相对于去声明 number0, number1, ..., number99 的变量,使用数组形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易于扩展。

数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推。

定义数组

//var 名称 [数量]类型 
var list [5]int
//修改数组内的数值 
list[4] = 10
//名称 :=[数量]类型{数据1,数据2,数据3,....} 
//不得超过最大数量 
list :=[5]int{1,2,3,4,5}

定义二维数组

var list [5][5]int 
list :=[5][5]int{ 
        {1,2,3,4,5}, 
        {1,2,3,4,5}, 
        {1,2,3,4,5}, 
        {1,2,3,4,5}, 
        {1,2,3,4,5}, 
    }

切片

Go 语言切片是对数组的抽象。

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

1、定义切片

//var 名称 = make([]类型,初始空间大小) 
var list = make([]int,3) 
//var 名称 []类型 = make([]类型,初始空间大小) 
var list []int=make([]int,3)

2、类型推断

//名称 := make([]类型,初始空间大小) 
list := make([]int,3) 
//名称 := []类型{数据1,数据2,数据3,....} 
list := []int{1,2,3}

3、切片添加数据

//变量=append(切片, 数据1,数据2,数据3,....) 
list=append(list,1,2,3 )

4、切片截取

//变量 = 切片[起始:结束+1] 
list1 := list[0:5]

map的使用

Map 是一种无序的键值对的集合。

Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,遍历 Map 时返回的键值对的顺序是不确定的。

在获取 Map 的值时,如果键不存在,返回该类型的零值,例如 int 类型的零值是 0,string 类型的零值是 ""。

Map 是引用类型,如果将一个 Map 传递给一个函数或赋值给另一个变量,它们都指向同一个底层数据结构,因此对 Map 的修改会影响到所有引用它的变量。

定义

//定义 
//var 名称 = make(map[类型]类型) 
var maps = make(map[string]int) 

// var 名称 map[类型]类型 = make(map[类型]类型) 
var maps map[string]int=make(map[string]int) 

//var 名称 = map[类型]类型{key1:value1,key2:value2,key3:value3,....} 
var maps = map[string]string{"张三":"1","李四":"2"} 

//名称 := map[类型]类型{key1:value1,key2:value2,key3:value3,....} 
maps := map[string]string{"张三":"1","李四":"2"} 

//名称 := make(map[类型]类型) 
maps :=make(map[string]int)

//存值 
//变量[key]=数据 
maps["张三"]=10 
maps["李四"]=10 

//取值 
//数据,ok=变量[key] 
v,ok:=maps["张三"] 

//删除 
//delete(变量,key) 
delete(maps,"张三")

range的使用

Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。

maps := map[string]string{"张三":"1","李四":"2"} 
for k,v := range maps{ 
    fmt.Println(k,v) 
} 

list := []int{1,2,3} 
for i,num := range list{ 
    fmt.Println(i,num) 
}

函数

函数是基本的代码块,用于执行一个任务。

函数定义

// fun 名称 (变量1 类型,变量2 类型) (类型,类型){ 
//} 
// fun 名称 (变量1 类型,变量2 类型) 类型{ 
//} 
func Add(a int , b int) int { 
    return a+b 
} 
func main() { 
    Add(1,2) 
}

指针

Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。

接下来让我们来一步步学习 Go 语言指针。

我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址。

Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

func Add(a *int) { 
    *a=*a+10 
} 
//变量->指针(&) 
//指针->变量(*) 
func main() { 
    num :=10 Add(&num) 
}

结构体的使用

Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

//结构体的使用 
type Person struct { 
    Name string 
    Age string 
} 
func main() { 
    a :=Person{Name: "", Age: ""} 
    b :=Person{"", ""} 
    c :=Person{Name: ""} 
    d :=Person{Age: ""} 
    e := Person{} 
    e.Age="12" 
    d.Age="12" 
}

结构体的方法

//结构体的方法 
type Person struct { 
    Name string 
    Age string 
} 

func (receiver Person) Add1() {
    //不可修改结构体的值 
} 

func (receiver *Person) Add2() { 
    //可以修改结构体的值 
} 

func main() {

}

错误处理

//错误处理 
type Person struct { 
    Name string 
    Age string 
} 
func (receiver Person) Add1() (int,error){ 
    return 0,errors.New("错误") 
} 
func (receiver *Person) Add2() (int,error) { 
    return 10,nil 
} 
func main() { 
    n,err:=Person{}.Add1() 
    n,_:=Person{}.Add2() 
}