Go 语言入门指南:基础语法和常用特性解析
1.什么是Go语言
Go,也称为 Golang 或 Go 语言,是Google 开发的一种开源编程语言。软件开发人员在一系列操作系统和框架中使用 Go 来开发 Web 应用程序、云和网络服务以及其他类型的软件。
2.基本语法
Hello World
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello World")
}
第一行package main代表这个文件属于main包的一部分,main包也就是程序的入口包。
第三行导入标准库里面的FMT包。这个包主要是用来往屏幕输入输出字符串、格式化字符串。
import下面是main函数,main函数里面调用了fmt.Println输出helloworld。要运行这个程序的话,我们就直接go run helloworld.go。
变量
Go语言是一种强类型语言,变量在声明时必须指定其类型,并且类型不能改变。常见的变量类型包括整数类型(int、int8、int16、int32、int64)、浮点数类型(float32、float64)、布尔类型(bool)、字符串类型(string)等。通过明确指定变量类型,可以提高代码的安全性和可靠性。
package main
import "fmt"
func main() {
var name string = "John"
var age int = 30
var isStudent bool = true
fmt.Println(name, age, isStudent)
}
条件与循环
Go语言提供了条件语句(if-else)和循环语句(for)来实现逻辑控制。条件语句可根据条件表达式的结果选择执行不同的代码块,而循环语句则用于重复执行特定的代码块。在循环语句中,可以使用关键字break和continue来控制循环的流程。
package main
import "fmt"
func main() {
score := 90
if score >= 90 {
fmt.Println("优秀")
} else if score >= 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}
for i := 1; i <= 5; i++ {
fmt.Println(i)
}
}
switch语句
Go语言的switch语句更加灵活,支持多个条件分支和表达式匹配。它可以根据表达式的值选择执行对应的代码块。与其他编程语言不同的是,在Go语言中,每个分支的执行完毕后会自动退出,无需使用break语句。
ackage main
import "fmt"
func main() {
numbers := []int{1, 2, 3, 4, 5}
fmt.Println(numbers[0]) // 输出第一个元素
fmt.Println(numbers[1:4]) // 输出索引1到3的元素
fmt.Println(numbers[:3]) // 输出前三个元素
fmt.Println(numbers[2:]) // 输出索引2及之后的元素
}
数组
数组是一种固定大小的数据结构,可以存储相同类型的元素。在Go语言中,数组的大小是固定的,并且通过索引访问元素。例如,var arr [5]int声明了一个包含5个整数的数组。可以使用循环来遍历数组元素。
切片
切片是对底层数组的动态窗口,它提供了更灵活的长度和容量。切片可以根据需要增加或缩减其长度。与数组不同,切片的长度可以在运行时进行改变。切片的创建方式为make([]T, length, capacity),其中T表示元素类型,length表示长度,capacity表示容量。
map
map是Go语言内置的一种关联数据类型,也称为字典。它由键值对组成,键必须唯一且无序。通过键可以快速检索到对应的值。使用make(map[keyType]valueType)可创建一个空的map,例如ages := make(map[string]int)。
range
range关键字用于迭代数组、切片、字符串、map等数据结构。它提供了一种简洁的方式来遍历这些数据结构,并返回索引和值。例如,for index, value := range array。
函数
函数是Go语言的基本构建块之一。它们用于封装可重用的代码块,并接收参数并返回结果。在Go语言中,函数可以有多个返回值,并支持匿名函数和闭包的概念。函数的定义格式为func functionName(parameters) (returnType) { ... }。
package main
import "fmt"
func add(a, b int) int {
return a + b
}
func main() {
result := add(3, 5)
fmt.Println(result)
}
指针
指针是变量的内存地址。通过指针,可以直接访问或修改变量的值。在Go语言中,可以使用&操作符获取变量的地址,使用*操作符获取指针指向的值。
package main
import "fmt"
func main() {
var num int = 10
var ptr *int = &num
fmt.Println(*ptr) // 输出指针指向的值
}
结构体与结构体方法
结构体是一种自定义的复合数据类型,它可以包含不同类型的字段。通过定义结构体,可以创建具有多个相关字段的自定义类型。结构体方法是与结构体关联的函数,它们可以对结构体进行操作和修改。
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p Person) SayHello() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}
func main() {
person := Person{Name: "John", Age: 30}
person.SayHello()
}
错误处理
错误处理是编写健壮程序的关键部分。Go语言使用error类型来表示错误,并通过返回错误值来进行处理。下面是一个错误处理的示例代码:
import ( "errors" "fmt" )
func divide(a, b float64) (float64,
继续
error) { if b == 0 { return 0, errors.New("除数不能为零") } return a / b, nil }
func main() { result, err := divide(10, 0) if err != nil { fmt.Println("发生错误:", err) } else { fmt.Println("结果:", result) } }
字符串操作与格式化
Go语言提供了丰富的字符串操作函数和格式化工具。下面是一个字符串操作和格式化的示例代码:
package main
import (
"fmt"
"strings"
)
func main() {
str1 := "Hello, World!"
str2 := "hello"
fmt.Println(strings.Contains(str1, "World")) // 判断是否包含子字符串
fmt.Println(strings.ToUpper(str2)) // 将字符串转换为大写
fmt.Printf("%s %d\n", str1, len(str1)) // 字符串格式化输出
}
JSON处理
Go语言内置了对JSON的支持,可以方便地进行JSON的编码和解码。下面是一个JSON处理的示例代码:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
person := Person{Name: "John", Age: 30}
jsonData, _ := json.Marshal(person) // 结构体转换为JSON字符串
fmt.Println(string(jsonData))
var decodedPerson Person
json.Unmarshal(jsonData, &decodedPerson) // JSON字符串解析为结构体
fmt.Println(decodedPerson.Name, decodedPerson.Age)
}
时间处理
Go语言提供了强大的时间处理功能,可以进行时间的格式化、解析和计算等操作。下面是一个时间处理的示例代码:
package main
import (
"fmt"
"time"
)
func main() {
currentTime := time.Now()
fmt.Println(currentTime.Format("2006-01-02")) // 时间格式化
fmt.Println(currentTime.AddDate(0, 1, 0)) // 增加一个月
}
数字解析
Go语言提供了用于数字解析的函数,可以将字符串转换为对应的数字类型。下面是一个数字解析的示例代码:
package main
import (
"fmt"
"strconv"
)
func main() {
numberStr := "1234"
number, _ := strconv.Atoi(numberStr) // 字符串转换为整数
fmt.Println(number)
numberFloat, _ := strconv.ParseFloat(numberStr, 64) // 字符串转换为浮点数
fmt.Println(numberFloat)
}
进程信息
在Go语言中,可以通过os包获取当前进程的信息。下面是一个获取进程信息的示例代码:
package main
import (
"fmt"
"os"
)
func main() {
processID := os.Getpid()
processPath, _ := os.Executable()
fmt.Println("Process ID:", processID)
fmt.Println("Process Path:", processPath)
}