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

64 阅读4分钟

今天整理下第一次课的go语言基础语法和常用特性解析。Go语言是一门开源、快速、简洁且具备高并发特性的编程语言。它由Google开发,旨在提供一种高效的方式编写可靠、简单和高性能的软件。本笔记将介绍Go语言的基础语法和常用特性。

1. 基础语法

1.1 包和导入

  • Go程序由包组成,包类似于命名空间,用于组织和复用代码。
  • 使用import关键字导入其他包,可以导入多个包,也支持别名导入。
package main

import (
    "fmt"
    "math"
)

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

1.2 函数

  • 使用func关键字定义函数,格式为func 函数名(参数列表) 返回值类型
  • Go语言支持多返回值。
package main

import "fmt"

func add(a, b int) int {
    return a + b
}

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

func main() {
    fmt.Println(add(2, 3))
    a, b := swap("hello", "world")
    fmt.Println(a, b)
}

1.3 变量与常量

  • 使用var关键字声明变量,可以使用类型推断自动推导变量类型。
  • 使用const关键字声明常量。
package main

import "fmt"

func main() {
    var x int = 10
    y := 5 // 类型推断,等同于 var y int = 5

    const z = 3.14
    fmt.Println(x, y, z)
}

1.4 条件语句与循环

  • Go语言使用if-else进行条件判断,支持在条件判断前执行简单语句。
  • for循环是Go语言唯一的循环结构,没有whiledo-while
package main

import "fmt"

func main() {
    x := 10
    if x > 5 {
        fmt.Println("x is greater than 5")
    } else {
        fmt.Println("x is less than or equal to 5")
    }

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

2. 常用特性

2.1 切片(Slice)

Go语言中的切片(Slice)是一种灵活、动态长度的序列,它是对数组的封装,并且相比于数组,切片具有更多的优势和便利性。切片是一种引用类型,它指向一个底层数组,并且可以自动扩容。

package main

import "fmt"

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

    // 对切片进行追加
    numbers = append(numbers, 6)
    fmt.Println(numbers)

    // 对切片进行切割
    slice := numbers[1:4] // 包含索引1,不包含索引4
    fmt.Println(slice)
}

切片与数组的区别

切片与数组的区别主要体现在以下几点:

  1. 切片长度是动态的,数组长度是固定的。
  2. 切片是引用类型,数组是值类型。对切片进行修改会影响底层数组,而对数组进行修改不会影响其他变量的值。
  3. 切片的创建和操作更加方便,可以使用append函数动态增加元素。

2.2 结构体(Struct)

在Go语言中,结构体(Struct)是一种用户自定义的复合数据类型,用于封装多个不同类型的值。结构体可以包含零个或多个字段(Fields),每个字段都有一个名称和类型,类似于C语言中的结构体。结构体可以看作是一种轻量级的类,用于组织数据并对其进行操作。

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p1 := Person{"Alice", 30}
    fmt.Println(p1)

    p2 := Person{Age: 25, Name: "Bob"}
    fmt.Println(p2)

    // 结构体指针
    p3 := &Person{Name: "Charlie", Age: 28}
    fmt.Println(p3.Name)
}

Go语言中的结构体可以定义方法,方法是一种和结构体关联的函数。结构体方法可以通过结构体变量调用,用于对结构体的字段进行操作和处理。

type Circle struct {
    Radius float64
}

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

c := Circle{Radius: 5}
fmt.Println(c.Area()) // 输出:78.5

2.3 接口(Interface)

在Go语言中,接口(Interface)是一种抽象类型,它定义了一组方法的签名,但没有具体的实现。接口允许将实现不同类型的对象视为同一类型,从而实现多态性。

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() {
    c := Circle{Radius: 5}
    r := Rectangle{Width: 4, Height: 3}

    shapes := []Shape{c, r}

    for _, shape := range shapes {
        fmt.Println("Area:", shape.Area())
    }
}

这里仅是Go语言基础语法和常用特性的简要介绍。Go语言还有许多高级特性和用法,如并发、goroutines、channel等,这些特性使得Go语言成为一门适用于网络编程和并发编程的强大语言。