Go 语言快速入门指南一:起步、类型、循环、条件 | 豆包MarsCode AI刷题

87 阅读8分钟

简介

Go语言,全称Golang, 是由Google开发的一种开源编程语言,首次发布于2009年。它旨在提供简洁、高效、可靠的软件开发解决方案。Go语言是一种静态强类型、编译型语言,以其并发机制和新颖的类型系统著称,能够有效地利用多核与联网的计算机。

如今,Go语言已经被诸如字节、Google、腾讯、facebook、bilibili等诸多知名互联网公司采用。对于开发者而言,使用go的主要优势有:

  1. 简洁易学: Go语言的语法设计简洁,学习路线平滑。它的设计理念是让开发者专注于清晰和高效的代码,使新手也能较快上手。

  2. 高效的并发处理: Go的并发模型是其最显著的优势之一。Go 使用了go关键字来实现轻量级的并发处理。Goroutines 是 Go 的并发单元,创建和销毁开销非常小,可以在同一程序中同时执行大量的任务。

  3. 跨平台支持: Go 是跨平台的,可以在 Windows、macOS、Linux 和许多其他操作系统上运行。Go 编译的二进制文件是静态链接的,意味着它不依赖于外部的动态链接库,使得部署更加简单方便。

  4. 支持模块化和包管理: Go 提供了强大的包管理工具 (go mod),使得开发者能够轻松管理项目的依赖。Go 的模块化设计让项目结构更加清晰、维护更加方便。

  5. 部署简单: Go 编译后的二进制文件是静态链接的,这意味着它不需要依赖外部的库或运行时环境。你只需将编译出来的二进制文件部署到目标机器上即可,极大简化了部署流程。

  6. 适合云原生和微服务: 由于 Go 语言的轻量级、并发性能和优秀的标准库,它特别适合用来构建云原生应用和微服务架构。Go 在分布式系统和高并发场景中表现尤为出色。

Go的HelloWorld

以下的部分需要有C或Java等语言的基础。另外不建议在没有学习过编程的前提下,就直接接触go语言。

package main

import "fmt"

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

虽然简单,但这个程序却蕴含了许多特性。对每一行代码的解释如下:

package main:这表示程序是一个可执行的包(而不是一个库)。

import "fmt":fmt 是 Go 的标准库之一,用于格式化输入输出。这里导入 fmt 包,以便我们可以使用 fmt.Println 来输出文本。

func main():main 函数是 Go 程序的入口点。

fmt.Println("Hello, World!"):这行代码会打印出 Hello, World! 到标准输出。

另外本文将不考虑安装Go的问题,这里推荐直接使用豆包MarsCOde 直接使用在线IDE, 可以有效节省初期不必要的麻烦。

变量

Go语言支持和传统语言一样显式声明类型,但也支持使用:=来自动推导,这个符号和SQL很相似。

package main

import "fmt"

func main() {
    // 声明并初始化一个整数变量
    var age int = 25
    // 声明并初始化一个浮点数变量
    var weight float64 = 70.5
    // 声明并初始化一个字符串变量
    var name string = "John"

    // 使用简短声明进行变量声明和赋值
    name1 := "Alice"
    age1 := 30
    weight1 := 65.5

    // 在一行中声明多个变量
    var name2, city2 string = "Bob", "New York"
    var age2, score2 int = 28, 90

}

Go语言有以下基础类型:

  1. 布尔类型(Boolean Type)

bool:布尔类型,取值为 true 或 false。

  1. 数字类型(Numeric Types)Go 语言中的数字类型分为整型和浮点型。

整型(Integer Types)

有符号整型:

int8:8 位有符号整数,取值范围:-128 到 127

int16:16 位有符号整数,取值范围:-32,768 到 32,767

int32:32 位有符号整数,取值范围:-2,147,483,648 到 2,147,483,647

int64:64 位有符号整数,取值范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

无符号整型:

uint8:8 位无符号整数,取值范围:0 到 255

uint16:16 位无符号整数,取值范围:0 到 65,535

uint32:32 位无符号整数,取值范围:0 到 4,294,967,295

uint64:64 位无符号整数,取值范围:0 到 18,446,744,073,709,551,615

int 和 uint:

int:平台相关的整数类型(32 位或 64 位),用于表示有符号整数。

uint:无符号的整数类型(32 位或 64 位),用于表示无符号整数。

浮点型(Floating-point Types)

float32:32 位浮点数,符合 IEEE-754 标准,精度较低。

float64:64 位浮点数,符合 IEEE-754 标准,精度较高,Go 中的默认浮点数类型。

复数类型(Complex Types)

complex64:由 float32 类型的实部和虚部构成的复数。

complex128:由 float64 类型的实部和虚部构成的复数。

  1. 字符串类型(String Type)

string:表示字符串类型。Go 中的字符串是由 UTF-8 编码的字符组成的不可变序列。

  1. 字节类型(Byte and Rune Types)

byte:实际上是 uint8 的别名,用来表示单个字节,通常用于表示字符。

rune:实际上是 int32 的别名,用于表示一个 Unicode 字符,通常表示一个字符。

  1. 指针类型(Pointer Type)

指针类型用来存储变量的内存地址。Go 语言的指针是类型安全的,不能进行算术运算。在Go中指针主要用作修改调用方函数的变量,也可以用作免复制引用传递。

Go语言由于有自动类型推导,所有不用过于关注基本类型的种类。但是Go作为一门支持面向对象和函数式编程的语言,其类型有一些复杂,这个后面再说。

if/else

这里的语法和C家族的很像了,有一点是编写go时会把多条;分割的语句一起放在if条件里,而且条件不需要加括号。

package main

import "fmt"

func main() {
    score := 85

    if score >= 90 {
        fmt.Println("You got an A!")
    } else if score >= 80 {
        fmt.Println("You got a B!")
    } else if score >= 70 {
        fmt.Println("You got a C!")
    } else {
        fmt.Println("You failed!")
    }

    //条件里放多条语句
    if temperature := 25; temperature > 30 {
        fmt.Println("It's hot outside.")
    } else {
        fmt.Println("The weather is fine.")
    }
}

循环

在 Go 语言中,循环支持传统for循环和range循环。

for 循环

Go 语言的 for 循环是唯一的循环结构,它可以像 C 语言那样使用三部分形式:初始化、条件判断和迭代操作。

package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
}

for 循环(无条件,类似 while)

Go 语言的 for 循环还可以省略初始化部分、条件部分和后置语句,从而使其像 while 循环一样使用:

package main

import "fmt"

func main() {
    i := 0
    for i < 5 {
        fmt.Println(i)
        i++
    }
}

无限循环

Go 中的 for 循环可以用于无限循环,只需省略条件判断部分,形成一个永远为 true 的循环。

package main

import "fmt"

func main() {
    count := 0
    for {
        count++
        fmt.Println("Count:", count)
        if count >= 5 {
            break
        }
    }
}

for 循环带 range

Go 语言提供了 range 关键字,结合 for 循环可以非常方便地遍历数组、切片、字符串、map 和通道。

package main

import "fmt"

func main() {
    arr := []int{10, 20, 30, 40, 50}
    
    for i, value := range arr {
        fmt.Printf("Index: %d, Value: %d\n", i, value)
    }
}

如果只关心值,可以省略索引:

for _, value := range arr {
    fmt.Println(value)
}

for 循环遍历 map

range 也可以用于遍历 map,返回键和值。

package main

import "fmt"

func main() {
    m := map[string]int{
        "apple":  5,
        "banana": 3,
        "cherry": 7,
    }

    for key, value := range m {
        fmt.Printf("Key: %s, Value: %d\n", key, value)
    }
}

跳出循环与继续下一次循环

Go 中提供了 break 和 continue 语句来控制循环的流程。

break:立即退出整个循环

continue:跳过当前循环的剩余部分,开始下一次循环

package main

import "fmt"

func main() {
    for i := 1; i <= 10; i++ {
        if i == 5 {
            continue // 跳过当前循环,继续下一次循环
        }
        if i == 8 {
            break // 退出循环
        }
        fmt.Println(i)
    }
}

switch

Go的switch和C略有不同,它的case不需要加break.如果想要一个结果匹配多个条件,可以直接加case.

package main

import "fmt"

func main() {
    x := 2
    switch x {
    case 1:
        fmt.Println("x is 1")
    case 2:
        fmt.Println("x is 2")
    case 3:
        fmt.Println("x is 3")
    default:
        fmt.Println("x is something else")
    }
}

package main

import "fmt"

func main() {
    x := 5
    switch x {
    case 1, 2, 3:
        fmt.Println("x is 1, 2, or 3")
    case 4, 5, 6:
        fmt.Println("x is 4, 5, or 6")
    default:
        fmt.Println("x is something else")
    }
}