Go语言,作为一种静态强类型、编译型的开源编程语言,以其简洁、高效和并发支持而闻名。它拥有基础的数据类型,如整型、浮点型、布尔型``和字符串型,支持变量声明、常量定义和基本的控制结构,如if语句、for循环和switch语句。Go还提供了丰富的内置类型,包括数组和切片、映射和结构体,以及接口和方法。函数是Go语言中的基本构建块,可以没有参数或返回值,也可以有多个参数和返回值。Go的并发模型基于协程(goroutine)和通道(channel),使得并发编程变得简单。这些特性使得Go语言特别适合于系统编程、网络编程和并发任务。
以下是一些Go语言的基础语法:
-
安装和环境设置:
- 从Go语言官网下载并安装Go。
- 设置环境变量
GOPATH,用于指定Go的工作目录。
-
Hello World程序:
package main import "fmt" func main() { fmt.Println("Hello, World!") } -
基本数据类型:
- 整型:
int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64。 - 浮点型:
float32,float64。 - 布尔型:
bool。 - 字符串型:
string。
- 整型:
-
变量声明:
var a int = 10 var b string = "Hello" -
常量:
const Pi = 3.14159 -
控制结构:
-
if语句:
if x > 0 { // code } else { // code } -
for循环:包括无限循环、带条件的for循环、带continue的for循环以及while-like的for循环。
package main // 定义包名为main,这是Go程序的入口点。 import "fmt" // 导入fmt包,用于格式化输出。 func main() { // main函数是程序的入口点。 i := 1 // 声明整型变量i并初始化为1。 for { // 开始一个无限循环。 fmt.Println("loop") // 打印字符串"loop"。 break // 遇到break语句,退出循环。 } // 由于break语句,这个循环只会执行一次。 for j := 7; j < 9; j++ { // 开始一个for循环,初始化变量j为7,条件 是j小于9,每次循环j增加1。 fmt.Println(j) // 打印变量j的值。 } // 这个循环会打印7和8。 for n := 0; n < 5; n++ { // 开始一个for循环,初始化变量n为0,条件是n 小于5,每次循环n增加1。 if n%2 == 0 { // 如果n是偶数(n除以2的余数为0)。 continue // 遇到continue语句,跳过当前循环的剩余部 分,继续下一次循环。 } fmt.Println(n) // 如果n是奇数,打印变量n的值。 } // 这个循环会打印1, 3。 for i <= 3 { // 开始一个for循环,条件是变量i小于等于3。 fmt.Println(i) // 打印变量i的值。 i = i + 1 // 每次循环i增加1。 } // 这个循环会打印1, 2, 3,然后i变为4,条件不满足,循环结束。 } -
switch语句:
switch day { case 0, 6: fmt.Println("Weekend") default: fmt.Println("Weekday") }
-
-
函数:
func myFunction() { // code } -
数组和切片:
- 数组:
var arr [5]int = [5]int{1, 2, 3, 4, 5}
- 数组:
-
var arr [5]int:声明了一个名为arr的数组变量,该数组有5个元素, 每个元素都是整型(int)。 -
[5]int表示这是一个长度为5的整型数组,大括号{1, 2, 3, 4, 5}中 的数字是数组的初始值,分别赋值给数组的每个元素。- 切片:
var slice []int = []int{1, 2, 3, 4, 5} -
var slice []int:声明了一个名为slice的切片变量,该切片可以存储整型(int)元素。[]int{1, 2, 3, 4, 5}:这是对切片slice的初始化。[]int表示这是一个可以存储整型元素的切片,大括号{1, 2, 3, 4, 5}中的数字是切片的初始值。 -
与数组不同,切片是动态的,它们可以增长和缩小,而且切片底层是由数组支持的。
- 映射(Map):
map := make(map[string]int) map["key"] = 10
make(map[string]int):这是一个创建映射的表达式。make是一个内置函数,用于初始化切片、映射和通道(channel)。在这里,它创建了一个空的映射,其键是string类型,值是int类型。map["key"] = 10:这行代码向映射中添加一个新的键值对。键是一个字符串"key",值是一个整数10。
- 结构体(Struct):
type Person struct { Name string Age int }
type Person struct:这行代码声明了一个名为Person的新类型,它是一个结构体类型。struct:这个关键字表示接下来的大括号{}内定义的是结构体的字段。Name string:这是结构体Person的第一个字段,名为Name,类型为
string。它用于存储一个人的姓名。
-
接口(Interface): 在Go语言中,接口(Interface)是一种类型,它定义了一组方法签名。一个接口类型的变量可以持有任何实现了这些方法的值。接口是Go语言中实现多态和代码解耦的关键机制。
type Reader interface { Read(p []byte) (n int, err error) }type Reader interface:这行代码声明了一个名为Reader的新类型,它是一个接口类型。Read(p []byte) (n int, err error):这是接口Reader中定义的唯一方法。它有一个参数p,这是一个指向字节切片的指针([]byte),以及两个返回值:一个int类型的n和一个error类型的err。p []byte:参数p是一个字节切片,表示可以从中读取数据的缓冲区。n int:返回值n表示实际读取的字节数。err error:返回值err表示在读取过程中是否发生错误,如果没有错误则为nil。
-
并发编程:
- 协程(Goroutine):
func say(s string, c chan string) { fmt.Println(s) c <- s // 发送数据到通道 } func main() { c := make(chan string) go say("hello", c) // 启动goroutine msg := <-c // 从通道接收数据 fmt.Println(msg) } - 通道(Channel):
ch := make(chan int)
- 协程(Goroutine):
-
错误处理:
_, err := ioutil.ReadFile("file.txt") if err != nil { log.Fatal(err) } -
包(Package):
- 导入包:在Go语言中,你可以导入其他包来使用它们提供的功能。这通常是通过在文件的顶部声明
import语句来完成的。import "fmt" - 定义包:每个Go文件都属于一个包。通过
package声明来定义一个包,这个声明必须是每个Go文件的第一行代码。package main
- 导入包:在Go语言中,你可以导入其他包来使用它们提供的功能。这通常是通过在文件的顶部声明
这些是Go语言的一些基础语法,Go语言以其简洁、高效和并发支持而闻名。掌握这些基础语法后,可以进一步学习更高级的特性和最佳实践。