Go语言基础语法 (一)| 豆包MarsCode AI刷题

88 阅读5分钟

1. Go语言简介

Go语言是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译并发型语言。Go语言具有以下特点:

  1. 高性能、高并发
  2. 语法简单易懂,类似于C语言
  3. 拥有功能完善、质量可靠的标准库
  4. 丰富的工具链,包括单元测试框架
  5. 静态编译,部署方便
  6. 快速编译
  7. 跨平台支持8. 带垃圾回收的语言

2. Go语言基础语法

2.1 Hello World

package main

import "fmt"

func main() {
    fmt.Printf("Hello World!")
}

编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main
import "fmt"表示导入了一个fmt包,它包含了一些基本的格式化输出。
Go函数以关键字func开头。每一个可执行程序中必须拥有一个main函数。
另外,Go程序并不要求开发者在每个语句后面加上分号表示语句结束,一行代表一个语句结束。

2.2 变量

常见的变量类型包括字符串、整数、浮点型、布尔型。其中字符串是内置类型,可以直接通过加号去拼接。
Go语言中声明变量通常使用 var 关键字,具体格式为:var 变量名 = 数据

    var a = "initial"

    var b, c int = 1, 2
    
    var e float64

	f := float32(e)

	g := a + "foo"
	fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
	fmt.Println(g)                // initialfoo

通过这种方式去声明变量,可以直接通过变量的初始值来判断变量类型。如果有需要也可以写出变量的类型,参考第三行代码。
另一种方法是使用:=符号,使用格式变量名 := 数据

a := 123
b := "abc"

2.3 if else

和c语言类似,相关的条件语句如下表所示:

语句描述
if 语句if 语句 由一个布尔表达式后紧跟一个或多个语句组成。
if…else 语句if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。

Go语言中的if语句的用法和C相差不大。需要注意的是if后面必须直接加大括号,不能像C或者C++一样,把if里面的语句写到同一行。

    if 表达式 { 
        /* 在表达式为真时执行 */ 
    } else {
        /* 在表达式为假时执行 */
    }

2.4 循环

在Go语言中只有唯一的一种for循环。最简单的for循环就是在表达式里面什么都不写,形成一个死循环。也可以使用经典的C循环,例如第12行代码

package main

import "fmt"

func main() {

	i := 1
	for {
		fmt.Println("loop")
		break
	}
	for j := 7; j < 9; j++ {
		fmt.Println(j)
	}

	for n := 0; n < 5; n++ {
		if n%2 == 0 {
			continue
		}
		fmt.Println(n)
	}
	for i <= 3 {
		fmt.Println(i)
		i = i + 1
	}
}

在循环里面有两个关键操作break和continue,break操作是跳出当前循环,continue是跳过本次循环。\

2.5 switch

Go语言中的switch分支结构看起来也和C或者C++比较类似。这里有一个很大的不同点是在C++里面,case语句后如果不加break跳出的话,会继续往下跑完所有的case分支。但是在Go语言中是不需要加的,匹配成功后不会自动向下执行其他case,而是跳出整个switch。

package main

import (
	"fmt"
	"time"
)

func main() {

	a := 2
	switch a {
	case 1:
		fmt.Println("one")
	case 2:
		fmt.Println("two")
	case 3:
		fmt.Println("three")
	case 4, 5:
		fmt.Println("four or five")
	default:
		fmt.Println("other")
	}

	t := time.Now()
	switch {
	case t.Hour() < 12:
		fmt.Println("It's before noon")
	default:
		fmt.Println("It's after noon")
	}
}

2.6 数组

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。Go语言中声明数组的格式:
var 数组名 [数组的长度]数据类型

数组的每个元素可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置。

package main

import "fmt"

func main() {
    var a [10]int
    for i := 0; i < 10; i++ {
       a[i] = i + 1
       fmt.Printf("a[%d] = %d\n", i, a[i])
    }

2.7切片

简单地说,切片就是一种简化版的动态数组。因为动态数组的长度不固定,切片的长度自然也就不能是类型的组成部分了。数组虽然有适用它们的地方,但是数组的类型和操作都不够灵活,而切片则使用得相当广泛。
我们可以使用make函数来创建一个切片

slice1 := make([]type, len)

append() :可以向切片中增加元素。

    s := make([]string, 3)
    s[0] = "a"
    s[1] = "b"
    s[2] = "c"
    fmt.Println("get:", s[2])   // c
    fmt.Println("len:", len(s)) // 3
    s = append(s, "d")
    s = append(s, "e", "f")
    fmt.Println(s) // [a b c d e f]

copy():在两个 slice 间复制数据,复制⻓度以 len 小的为准,两个 slice 可指向同⼀底层数组。

    c := make([]string, len(s))
    copy(c, s)
    fmt.Println(c) // [a b c d e f]

2.8 map

Go语言中的map(字典)是一种内置的数据结构,它是一个无序的key—value对的集合,比如以身份证号作为唯一键来标识一个人的信息,map是实际使用过程中使用最频繁的数据结构。我们可以用make去创建一个空map。

	m := make(map[string]int)

插入数据

	m["one"] = 1
	m["two"] = 2
	fmt.Println(m)           // map[one:1 two:2]
	fmt.Println(len(m))      // 2
	fmt.Println(m["one"])    // 1
	fmt.Println(m["unknow"]) // 0

我们可以使用ok获取这个在map中这个key是否存在,如下:value, ok := map[key] ,其中的value是返回值,ok是一个bool值,可知道key/value是否存在。

	r, ok := m["unknow"]
	fmt.Println(r, ok) // 0 false

删除数据

	delete(m, "one")
	fmt.Println(m) //map[two:2]
}