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

175 阅读6分钟

什么是Go语言

Go语言(又称为Golang)是一种开源的编程语言,由Google公司于2007年开始开发,并于2009年正式发布。Go语言的设计目标是简单、高效、可靠,并具有良好的并发处理能力。它借鉴了C语言的语法和部分特性,但去除了一些复杂和冗余的特性,使得代码更加简洁易读。

Go语言的特点

1.高性能、多并发
在Golang中不需要像其他语言一样需要有高度性能优化的第三方库,只需要标准库或者任意基于标准库的第三方库
2.语法简单、学习曲线平缓
3.有着丰富的标准库
4.完整的工具链
5静态链接
6快速编译
7跨平台
8垃圾回收

第一个Go程序“Hello world”

package main  //声明本代码所属的包
import "fmt"  导入fmt(format)包,使其可用
func main() {  //声明一个名为main的函数
fmt.Println("HelloWorld")  
}

运行后会打印出HelloWorld
Go语言代码的基本框架就是这样,尽管这段代码非常简短,但它引入了package、import、func、这三个非常重要的关键字,其中package关键字声明代码所属的包,import关键字导入自己将要用的包,而func用用于声明函数

第一个注意点 编译器唯一允许的大括号放置风格

如上述代码中“{”必须跟在()后

变量和常量

const用于声明常量,var用于声明变量(这里变量的类型就不一一叙述)

package main  
  
import (  
"fmt"  
)  
func main(){  
const d = 1
var a = 123 //第一种声明方式  
var b, c int = 1, 2 //第二种声明方式  
var ( //第三种声明方式  
f = 12  
g = 78  
)
u := 2 //第四种声明方式  
fmt.Println("a=", a)  
fmt.Println("b,c,f,g,u=", b, c, f, g, u)  
}

以上代码块提供了四种不同的声明方式,个人认为需要尤为关注的是第四种简略的声明方式,在后续代码中会大规模使用。

第二个注意点

Go语言要求声明的变量必须在后续的代码中使用,也可以使用下划线来忽略不需要使用的变量。(不同于作者使用过的其他语言)

if else语句

用法与其他语言类型,不同在于if后没有括号,条件直接写在if后面,条件后再加大括号

package main  
import (  
"fmt"  
)  
func main() {  
b := 1  
if b == 1 {  
fmt.Println("true")  
} else {  
fmt.Println("false")  
}  
}

上面代码会打印出true

for循环

在Go语言中只有for循环,没有while或者do while,同样没有括号,其余用法和其他语言类似。 这里只写for循环部分

for g := 0; g < 2; g++ {  
fmt.Println(a, c)  
}

switch

switch用法与其他语言类似,不做赘述,这里要注意的就是default在不同语言中代表的用法不同,还有go中不用break停止switch

switch a {  
case 1:  
fmt.Println("one")  
case 123:  
fmt.Println("two")  
default:  
fmt.Println("other")  
}

数组

这里唯一注意点就是在Go语言中数组的长度可以用内置的len函数确定

q := [5]int{1, 2, 3, 4, 5}  
fmt.Println(q)

还可以再次声明复制数组
如:a:=q
二位数组等就不赘述

切片数组

与数组声明类似,不过要注意不加长度,而且可以用append来扩大切片如:
原数组=append(原数组,"")
还可以这样用fmt.Println(q[2,5]),这样的意思是打印出q数组索引为2-5的值

哈希map

在Go语言中,Map是一种无序的键值对集合,也被称为字典或关联数组。Map中的每个元素都由一个唯一的键和对应的值组成。 以下是Map的基本用法和示例代码:

  1. 声明和初始化Map:

    // 声明一个空的Map
    var m map[keyType]valueType
    
    // 声明并初始化一个Map
    m := make(map[keyType]valueType)
    
    // 声明并初始化一个Map,并添加初始元素
    m := map[keyType]valueType{
        key1: value1,
        key2: value2,
    }
    

    其中,keyType表示键的类型,valueType表示值的类型。可以使用make函数创建一个空的Map,或者使用字面量方式声明并初始化Map。

  2. 添加和访问Map中的元素:

    // 添加元素
    m[key] = value
    
    // 获取元素
    val := m[key]
    

    使用m[key]的方式可以添加或修改Map中的元素,键不存在时会新增元素,键存在时会更新对应的值。使用m[key]的方式可以获取Map中指定键的值。

  3. 删除Map中的元素:

    delete(m, key)
    

    使用delete函数可以删除Map中指定键的元素。 以下是一个完整的示例代码:

package main
import "fmt"
func main() {
    // 声明并初始化一个Map
    m := map[string]int{
        "apple":  1,
        "banana": 2,
        "orange": 3,
    }
    // 添加元素
    m["grape"] = 4
    // 获取元素
    fmt.Println(m["apple"])   // 输出: 1
    fmt.Println(m["banana"])  // 输出: 2
    fmt.Println(m["orange"])  // 输出: 3
    fmt.Println(m["grape"])   // 输出: 4
    // 删除元素
    delete(m, "orange")
    // 遍历Map
    for key, value := range m {
        fmt.Println(key, value)
    }
}

在上述代码中,我们首先声明并初始化了一个Map,然后添加了一个新的元素。接着,我们通过键来访问和获取Map中的元素值,并使用delete函数删除了一个元素。最后,使用range关键字遍历了整个Map,并打印出每个键值对。

指针

指针是指向另一变量的地址的变量,这是一种间接访问的形式。

1.声明指针

var ptr *Type 这里的Type表示指针变量指向值的类型

2.创建指针变量:
var num int = 10
var ptr *int = &num

这里的&操作符号可以获取变量的内存地址并赋值给指针变量

3.打印指针指向的值

fmt.Println(*ptr) 这里的"*"操作符就可以访问指向的值

4.修改指向的值

*ptr = 20

第三个注意点

这里的修改指向值必须是这个形式,不然会报错。尽管很多用法和C语言中的类似,但是要注意go语言的指针不支持指针的运算或比较,而且go语言可以返回局部变量的值(不会像C语言一样导致悬空指针的问题),最后go语言还有默认的nil零值。

结构体

Go语言中的结构体是一种自定义的数据类型,它允许我们将不同的数据字段组合在一起,形成一个更复杂的数据结构。结构体在Go语言中被广泛用于表示实体对象或数据的集合。(个人感觉跟C语言中差不多) 下面是一个简单的示范

p:=Person{
    name:"Mike",
    age: 30,
}

访问结构体的字段也简单,只需要这样: p.name
结构体还可以相互嵌套 如:

type Address struct {
    city  string
    state string
}

type Person struct {
    name    string
    age     int
    address Address
}

总结

这里面也只是写了部分基础语法知识,还有很多的基础语法知识这里面没有涉及,比如接口、错误处理等。总的来说,大概学习了Go语言的基础语法,可以明显感觉到他的语言更为简洁高效,虽然我还没有把语法完全弄懂,但是在后续的学习中会逐步上手了解。 可能这篇文章的内容不是完全正确,望评论区大佬斧正。