青训营X豆包MarsCode Go 语言入门 | 豆包MarsCode AI 刷题

71 阅读3分钟

1. 基本语法

Go的Hello World程序:

go
复制代码
package main

import "fmt"

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

代码分析:

  • package main:Go程序以包为组织单位,其中main包表示程序的入口。
  • import:用于导入标准库或第三方库,例如fmt库用于格式化输出。
  • func main() :每个Go程序必须包含一个main函数,这是程序的执行起点。

Go语言通过强约束的编译规则(如不允许定义未使用的变量或包)提高了代码的规范性,同时减少了隐式错误。


2. 变量与类型

Go语言是静态强类型语言,支持显式声明和隐式类型推断。

go
复制代码
var a int = 42    // 显式声明
b := "hello"      // 隐式推断
  • var声明变量:需指定类型,可选初始值。
  • :=短变量声明:常用于函数内部,Go会根据初值推断变量类型。

此外,Go支持多个变量同时声明:

go
复制代码
var x, y, z = 1, 2, 3

3. 控制结构

Go的控制结构与C语言类似,支持条件语句、循环和选择结构,但省略了括号。

go
复制代码
if x > 10 {
    fmt.Println("x is greater than 10")
}

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

特点:

  • if语句支持在条件前定义变量,例如if n := 10; n > 5
  • Go仅提供for作为循环结构,代替了C语言的while

4. 函数

Go语言的函数支持多种灵活的定义方式,包括返回多个值。

go
复制代码
func add(x int, y int) int {
    return x + y
}

func swap(a, b string) (string, string) {
    return b, a
}

特点:

  • 参数类型可以简写:当多个参数类型相同时,只需在最后声明类型。
  • 多返回值函数:通过元组形式返回多个值。

函数还支持匿名函数和闭包:

go
复制代码
add := func(x, y int) int {
    return x + y
}
fmt.Println(add(3, 4))

5. 指针与内存管理

Go支持指针,但不允许直接操作指针(如C语言中的*p = value),以此提升安全性。

go
复制代码
var a = 10
var p = &a // 取地址
fmt.Println(*p) // 解引用

Go语言内置了垃圾回收(GC),程序员无需手动释放内存。


二、Go语言独特特性

1. 并发

Go语言以其强大的并发支持著称,主要依赖于goroutinechannel

goroutine
轻量级线程,用go关键字启动。例如:

go
复制代码
package main

import (
    "fmt"
    "time"
)

func printNumbers() {
    for i := 1; i <= 5; i++ {
        fmt.Println(i)
        time.Sleep(100 * time.Millisecond)
    }
}

func main() {
    go printNumbers() // 启动新的goroutine
    fmt.Println("Main function")
    time.Sleep(1 * time.Second) // 等待goroutine执行完毕
}

channel
用于goroutine之间的数据通信,保证并发的安全性。

go
复制代码
package main

import "fmt"

func sum(a []int, c chan int) {
    total := 0
    for _, v := range a {
        total += v
    }
    c <- total // 将结果发送到通道
}

func main() {
    c := make(chan int)
    go sum([]int{1, 2, 3}, c)
    fmt.Println(<-c) // 从通道接收数据
}

特性分析:

  • 轻量级:一个goroutine仅占用数KB内存。
  • 安全性:通过channel传递数据避免共享内存问题。

2. 接口与多态

Go没有类的概念,取而代之的是接口(interface),通过接口实现多态。

go
复制代码
package main

import "fmt"

type Shape interface {
    Area() float64
}

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}

type Rectangle struct {
    Width, Height float64
}

func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

func main() {
    var s Shape
    s = Circle{Radius: 5}
    fmt.Println("Circle Area:", s.Area())

    s = Rectangle{Width: 4, Height: 6}
    fmt.Println("Rectangle Area:", s.Area())
}

特点:

  • 接口只定义行为,不关心实现。
  • 类型实现接口的方式是隐式的,无需显式声明“实现了某接口”。