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

67 阅读7分钟

Hello, World

go
 代码解读
复制代码
package main // 声明包名
import "fmt" // 导入 fmt 包,提供格式化和打印函数
func main() { // 定义 main 函数
	fmt.Println("Hello, World!") // 调用 fmt 包的 Println 函数打印字符串
}
  • Go 语言的程序入口是 main 包中的 main 函数。
  • 使用 import 关键字导入需要的包,如 fmt 包提供格式化输出的函数。
  • fmt.Println 函数打印字符串到标准输出。
  • Go 语言每行代码行尾不需要加分号。
  • Go 语言不允许函数的左括号单独成行。
  • 要执行GO语言程序,可以使用 go run 命令,如 go run hello.go
  • 要编译GO语言程序,可以使用 go build 命令,生成一个可执行文件,如 go build hello.go
  • GO语言有多种运算符,如算术运算符 + - * / % ++ --、关系运算符 == != > < >= <=、逻辑运算符 && || ! 等。
  • GO语言有多种流程控制语句,如条件语句 ifswitchselect,循环语句 forrange,跳转语句 gotobreakcontinue 等。
  • GO语言支持并发编程,可以使用 go 关键字创建一个协程(goroutine),使用 chan 关键字创建一个通道(channel),实现多个协程之间的通信和同步。

变量、指针和赋值

  • 变量声明使用 var 关键字,常量声明使用 const 关键字。
  • 变量的定义形式为:var name [type] = [expression],其中 type 和 expression 可以省略一个,但不能同时省略。
  • 变量的类型默认值为零值,如数字类型为 0,布尔类型为 false,字符串类型为 “”,接口、切片、指针、映射、通道、函数等类型为 nil。
  • 变量可以使用 := 操作符进行声明并赋值,但只能在函数内部使用。
  • Go 语言支持指针类型,使用 & 操作符获取变量的地址,使用 * 操作符获取指针指向的值。
  • Go 语言也支持 new 函数创建一个变量,并返回其指针。
  • 赋值操作符为 = ,可以进行多重赋值,如 m, n = n, m 实现变量交换。
  • Go 语言也提供了自增、自减和 *= , += 等先运算后赋值的操作符。

选择和循环

go
 代码解读
复制代码
package main // 声明包名
import "fmt" // 导入 fmt 包,提供格式化和打印函数
func main() { // 定义 main 函数
	var score int = 85
        if score >= 90 {
            fmt.Println("优秀")
        } else if score >= 80 {
            fmt.Println("良好")
        } else if score >= 60 {
            fmt.Println("及格")
        } else {
        fmt.Println("不及格")
        }
}
  • Go 有 if else 和 switch 语句的条件选择,switch 语句的每个 case 不需要额外的 break。
go
 代码解读
复制代码
package main // 声明包名
import "fmt" // 导入 fmt 包,提供格式化和打印函数
func main() { // 定义 main 函数
	for i:= 0;i<10; i++{
        fmt.Println(i) //打印 0 - 9
        }
}
  • Go 语言只有 for 循环,可以实现C++的 while 和 do … while 。
  • for 循环也可以用 range 函数遍历数组、切片、映射等集合类型。

基本数据类型

  • 整型分为有符号和无符号两种,有多种类型,分别对应不同的位数和取值范围。
  • 浮点型分为 float32 和 float64 两种类型。
  • 复数分为 complex64 和 complex128 两种类型,由实部和虚部组成,可以使用内置的 real 和 imag 函数获取复数的实部和虚部。
  • 布尔类型只有两个值:true 和 false,默认值为 false。
  • 字符串类型表示一系列字节或字符,可以使用双引号或反引号定义。字符串是不可变的,可以使用 + 操作符进行拼接。字符串可以使用索引访问单个字节或字符(rune),也可以使用 len 函数获取长度。字符串可以转换为 []byte 或 []rune 类型进行更多操作。

数组

  • 数组是一种固定长度的序列类型,数组的长度是数组类型的一部分。数组可以使用 var name [length]type 的形式定义,也可以使用字面量初始化。
  • 数组是默认按值传递的,如果需要修改原数组,可以使用指针或切片作为参数传递。
  • 数组可以使用 len 函数获取长度,也可以使用 range 函数遍历元素。

切片

  • 切片是一种动态长度的序列类型,切片由三部分组成:指向底层数组的指针、切片的长度和切片的容量。切片的长度是切片中元素的个数,切片的容量是从切片的起始位置到底层数组的末尾位置的元素个数。
  • 切片可以使用 var name []type 的形式定义,也可以使用 make 函数创建指定长度和容量的切片。切片也可以通过数组或其他切片创建,使用 name[start:end] 的形式截取。
  • 切片是一种引用类型,传递给函数时,函数可以修改原切片的内容。
  • 切片可以使用 len 函数获取长度,cap 函数获取容量,也可以使用 range 函数遍历元素。
  • 切片可以使用 append 函数追加元素,如果切片的容量不足,会自动扩容。切片可以使用 copy 函数复制元素,返回复制的元素个数。

映射

  • 映射是一种键值对的无序集合类型,映射的键必须是可以比较的类型,如整型、浮点型、字符串、布尔、指针等。映射的值可以是任意类型。
  • 映射可以使用 var name map[keyType]valueType 的形式定义,也可以使用 make 函数创建指定容量的映射。映射也可以使用字面量初始化。
  • 映射是引用类型,传递给函数时,函数可以修改原映射的内容。
  • 映射可以使用 len 函数获取键值对的个数,也可以使用 range 函数遍历键值对。
  • 映射可以使用 name[key] = value 的形式添加或修改键值对,也可以使用 delete 函数删除键值对。映射可以使用 name[key] 或 value, ok := name[key] 的形式获取键对应的值,如果键不存在,返回零值。

结构体

  • 结构体是一种聚合类型,可以将不同类型的字段组合在一起。结构体可以使用 type name struct { … } 的形式定义,也可以使用字面量初始化。

  • 结构体是默认按值传递的,如果需要修改原结构体,可以使用指针作为参数传递。

  • 结构体可以使用 . 操作符访问字段,也可以使用 == 和 != 操作符比较两个结构体是否相等(前提是结构体中所有字段都是可比较的类型)。

  • 结构体可以嵌入其他结构体或接口类型作为匿名字段,实现类似继承和多态的功能。嵌入的字段可以直接访问,如果有同名字段,则遵循最外层优先原则。

总结

  1. 简洁的语法:Go语言的语法相对简洁,去除了许多传统C系语言中的冗余特性,如分号自动插入机制减少了不必要的输入,以及不需要在函数声明后加上左括号。这使得Go代码更加清晰易读。
  2. 强大的标准库:Go拥有丰富的标准库,涵盖了网络编程、文件操作、加密算法等多个领域,这大大简化了开发者的工作,提高了开发效率。
  3. 静态类型与编译时检查:Go语言是一种静态类型语言,这意呸着在编译阶段就能发现很多错误,如类型不匹配等问题,有助于提高代码质量。同时,Go的编译速度非常快,这使得快速迭代成为可能。
  4. 高效的并发模型:Go语言通过轻量级线程——goroutine和通道(channel)提供了强大的并发支持。这种模型简单直观,易于理解和使用,极大地降低了并发编程的门槛。
  5. 垃圾回收机制:Go语言内置了垃圾回收机制,自动管理内存分配与释放,减轻了开发者手动管理内存的压力,减少了因内存泄漏导致的问题。
  6. 面向对象的特性:虽然Go语言没有传统意义上的类,但是通过结构体和方法可以实现面向对象编程的核心概念,如封装、继承(通过结构体嵌入实现)、多态等。这种方式既保持了语言的简洁性,又不失灵活性。
  7. 跨平台编译:Go语言支持跨平台编译,允许开发者轻松地为不同操作系统和架构编译程序,这对于开发跨平台的应用来说是一个巨大的优势。