Go 语言入门指南:基础语法和常用特性解析 | 豆包MarsCode AI 刷题

55 阅读6分钟

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

基础语法

如何配置环境可点击here(仅供参考)

补充概念

GOROOT 是 Golang 安装目录的路径。它指定了 Go 编译器、标准库和其他相关工具所在的位置

GOPATH 是 Golang 工作区的路径,它是一个或多个目录的路径列表。Go工作区用于存放用户自己编写的Golang代码、下载的第三方库等

Hello World

  1. 创建项目

  2. 在项目目录下创建一个helloWorldDemo文件夹

  3. 在文件夹下创建main.go

main.go在Goland编辑器中会默认归于对应文件夹名的package

比如上述创建出的main.go会归于package helloWorldDemo

需将package helloWorldDemo改为package main

Golang主要通 过main包中的main方法启动程序和项目

  1. 编写代码
package main

import (
    "fmt" //用于格式化输入和输出。
          //它提供了一系列函数,用于将数据以不同的格式打印到控制台、将数据格式化成字符串,以及从标准输入读取格式化的数据等操作。
)

func main() {
    fmt.Println("hello world")
}
  1. 运行代码

方法一

在控制台终端进入对应main.go的文件目录,通过go run main.go运行程序

方法二

在控制台终端进入对应main.go的文件目录,通过go build生成二进制文件,然后通过./可执行文件名运行

方法三

简单快捷的在Goland中点击main方法旁边的绿色三角形箭头直接运行

格式化动词

fmt包中的格式化动词有很多种,用于不同类型的数据输出。

整数类型

%d:以十进制形式输出整数

%b:以二进制形式输出整数

%o:以八进制形式输出整数

%x或%X:以十六进制形式输出整数

浮点数类型

%f:以小数形式输出浮点数,默认精度是 6 位小数

%e或%E:以科学计数法输出浮点数

字符串类型

%s:输出字符串

%q:输出用双引号括起来的字符串,其中的特殊字符会被转义

其他类型

%p:用于输出指针的值,以十六进制形式显示内存地址

%t:输出布尔值,truefalse

%T:输出值的类型

变量和常量

常量

常量声明const用于声明常量。常量是在程序运行过程中其值不能改变的量

常量作用域:在函数内部声明的常量,其作用域仅限于该函数内部;在函数外部声明的常量,其作用域是整个包

package main

import "fmt"

const globalConstant = 50 //全局变量

func main() {
    const PI float64 = 3.14159 //声明了一个名为PI的常量,类型为浮点数(float64)
    
    const anotherConstant = 10 //声明了一个名为anotherConstant的常量,由golang自动推断类型

    const localConstant = 30 //局部变量
    fmt.Println("局部常量:", localConstant)
    fmt.Println("全局常量:", globalConstant)
}
变量

变量声明var用于声明变量。变量是一个可以存储数据的容器,其值可以在程序运行过程中改变

变量作用域:变量的作用域取决于其声明的位置。在函数内部声明的变量,其作用域仅限于该函数内部;在函数外部(如在包级别)声明的变量,其作用域是整个包(在该包内的所有函数都可以访问,前提是符合访问权限规则)

package main

import "fmt"

var globalVariable int = 20 //全局变量

var (
    a int
    b string = "bbbbbb"
    c bool
) //多个变量声明
func main() {
    var localVariable int = 10 //局部变量
    unusedVar := false //可以成功定义变量,但是在函数中未被使用会报错。Golang不允许有未被使用的变量出现
    fmt.Println("局部变量:", localVariable)
    fmt.Println("全局变量:", globalVariable)
}

基础数据类型

Golang有多种基本数据类型。

整数类型(intint8int16int32int64

浮点数类型(float32float64

布尔类型(bool

字符串类型(string

.....

类型转换:不同类型的数据在需要时可以进行转换。例如,将一个整数转换为浮点数可以使用float64(i)(假设i是一个整数)这样的表达式来实现

控制流语句

条件语句(if-else)

用于根据条件执行不同的代码块

package main

import "fmt"

var age1 = 20
var age2 = 16

func main() {
    if age1 >= 18 {
       fmt.Println("成年人")
    } else {
       fmt.Println("未成年人")
    }

    if age2 >= 18 {
       fmt.Println("成年人")
    } else {
       fmt.Println("未成年人")
    }
}
循环语句

golang所有的循环都通过for循环来实现

package main

import "fmt"

func main() {
    //普通for循环
    for i := 0; i < 10; i++ {
       fmt.Println(i)
    }

    //while循环
    j := 0
    for j < 5 {
       fmt.Println(j)
       j++
    }
    
    //类似java的foreach
    numbers := []int{1, 2, 3, 4, 5}
    for _, number := range numbers {
       fmt.Println(number)
    }
}

常用特性

切片(Slice)

切片是对数组的一个连续片段的引用,它是一种动态大小的数据结构。切片可以方便地对数据进行操作,如添加、删除元素等

创建和初始化:可以通过对数组进行切片操作来创建切片,也可以使用make函数创建

package main

import "fmt"

func main() {
    // 通过数组创建切片
    arr := [5]int{1, 2, 3, 4, 5}
    slice1 := arr[1:4] // 遵循左闭右开
    // 使用make函数创建切片
    slice2 := make([]int, 3)

    slice := []int{1, 2, 3}
    //切片支持添加元素(使用append函数)
    newSlice := append(slice, 4)
    //切片操作(获取子切片)
    subSlice := newSlice[1:3] // 遵循左闭右开

    fmt.Println(slice1) //[2 3 4]
    fmt.Println(slice2) //[0 0 0]

    fmt.Println(newSlice) //[1 2 3 4]
    fmt.Println(subSlice) //[2 3]
}

映射(Map)

映射(也称为字典或哈希表)是一种无序的键 - 值对数据结构。它可以用于存储和检索基于键的数据。对应javaHashMap

创建和初始化:可以使用make函数创建映射,也可以使用字面量进行初始化

package main

import "fmt"

func main() {
    // 使用make函数创建
    m := make(map[string]int)
    // 使用字面量初始化
    n := map[string]int{"apple": 1, "banana": 2}

    m["orange"] = 3 //添加键值对
    
    value, exists := m["apple"] //返回值和键是否存在(bool)
    if exists {
       fmt.Println("apple的值为", value)
    }
    delete(m, "banana")//删除键值对

    fmt.Println(m)
    fmt.Println(n)
}

指针(Pointer)

指针是存储变量内存地址的变量。在 Golang 中,指针可以用于在函数之间传递变量的地址,从而可以修改函数外部变量的值。

声明和操作:通过*运算符来声明指针类型,通过&运算符获取变量的地址

package main

func main() {
    var num int = 10
    var p *int = &num
    *p = 20
}

协程(Goroutine)

协程是 Go 语言中轻量级的线程。可以使用go关键字来启动一个协程。例如,go func() { fmt.Println("协程i执行") }()会启动一个新的协程来执行匿名函数中的代码。协程之间可以并发执行,提高程序的性能和效率。

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup //等待协程计数器
    for i := 0; i < 10; i++ {
       wg.Add(1) // 计数器加一
       go func(i int) {
          defer wg.Done() // defer关键字修饰的语句会在函数结束后执行
                          //一个函数多个defer,按照后进先出的顺序执行
          fmt.Printf("协程%d执行\n", i)
       }(i)
    }
    wg.Wait() //等待ing
}

相关资料

Golang官方标准库

Golang查找第三方依赖包