前言
Go语言是一门简单、高效、可靠的编程语言,由Google开发。它具备良好的并发性和高效的编译速度,语法简单、学习曲线平缓、具有丰富的标准库和完善的工具链等优点,因此成为了许多公司的选择。
本次笔记将详细记录Go语言的基础语法和常用特性,包括变量声明、控制流程、数据类型、函数定义、指针、错误处理、结构体和结构体方法、Josn处理等。通过学习,对Go语言有了一个全面的了解,并能够开始编写简单的Go程序。
一、变量声明和赋值
在Go语言中,可以使用var关键字来声明变量,并使用 = 进行赋值。示例代码如下:
`go
var num1 int
num1 = 10
var num2 = 20
num3 := 30 //简易的声明方法
var name string = "John"`
二、控制流程
Go语言中的控制流程包括条件语句和循环语句。常用的条件语句有if和switch,循环语句有for。示例代码如下:
`go
if num > 10 {
fmt.Println("Number is greater than 10")
} else {
fmt.Println("Number is less than or equal to 10")
}
switch color {
case "red":
fmt.Println("Color is red")
case "blue":
fmt.Println("Color is blue")
default:
fmt.Println("Color is not red or blue")
}
for i := 0; i < 5; i++ {
fmt.Println(i)
} `
三、数据类型
在Go语言中,有基本数据类型(如整型、字符串、布尔型)和复合数据类型(如数组、切片、字典)等。示例代码如下:
`go
var num int = 10 //整形
var name string = "John" //数组
var isStudent bool = true //布尔型
var numbers = []int{1, 2, 3, 4, 5} //数组
s:= make([]int, 3) //切片
var person = map[string]string{"name": "John", "age": "30"} //map
for k, v := range person {
fmt.Printf("key: %d, value: %d", k, v)
} //range
}
`
四、函数定义和调用
在Go语言中,可以使用func关键字来定义函数。函数可以接受参数,并返回一个或多个值。示例代码如下:
`go
func add(a, b int) int {
return a + b
}
result := add(5, 7) `
五、指针
在Go语言中,可以使用指针来引用和操作变量的内存地址。通过指针,我们可以间接地修改变量的值,也可以减少内存的使用。
`go
num := 42
// 获取变量的内存地址 ptr := &num
// 打印指针的值和指向的变量值 fmt.Println("指针的值:", ptr)
fmt.Println("指针指向的变量值:", *ptr)`
通过使用指针,我们可以在一些情况下提高代码的执行效率,以及实现更灵活的操作和数据共享。在使用指针时需要注意,空指针和野指针可能导致程序运行时的错误,因此在使用指针时要确保指针引用的变量是可用的。
六、错误处理
在Go语言中,错误处理是一个重要的特性。使用多返回值和错误类型,可以灵活地处理错误。示例代码如下:
`go
result, err := doSomething()
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
`
七、结构体
在Go语言中,结构体是一种用户自定义的复合数据类型,它可以包含不同类型的字段。结构体的定义使用type关键字,然后在定义中指定字段的名称和类型。下面是一个示例代码,演示了Go语言中结构体的基本用法:
`go package main import "fmt"
//定义一个结构体 type Person struct { Name string Age int Gender string }
func main() { // 创建一个结构体实例 person := Person{ Name: "Alice", Age: 25, Gender: "Female", }
// 访问结构体字段
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
fmt.Println("Gender:", person.Gender)
// 修改结构体字段
person.Age = 30
fmt.Println("Modified Age:", person.Age)
}`
结构体的基本用法,包括定义结构体类型、创建结构体实例和访问结构体字段。结构体可以在实现用户定义的数据类型时非常有用,它可以组合多个字段来表示一个完整的数据结构。
八、结构体方法
在Go语言中,结构体方法是与特定结构体相关联的函数。通过为结构体定义方法,我们可以在结构体上执行特定的操作。结构体方法的定义需要使用func关键字,紧接着是接收者的类型和方法名。在方法的定义中,我们可以使用接收者类型的字段和其他方法。下面是一个示例代码,演示了Go语言中结构体方法的基本用法:
`go package main import "fmt"
// 定义一个结构体 type Rectangle struct { Width int Height int }
// 定义结构体方法,计算矩形的面积 func (r Rectangle) Area() int { return r.Width * r.Height }
// 定义结构体方法,计算矩形的周长 func (r Rectangle) Perimeter() int { return 2 * (r.Width + r.Height) }
func main() { // 创建一个矩形实例 rect := Rectangle{Width: 5, Height: 10}
// 调用结构体方法计算面积和周长
area := rect.Area()
perimeter := rect.Perimeter()
// 打印结果
fmt.Printf("矩形的面积为: %d\n", area)
fmt.Printf("矩形的周长为: %d\n", perimeter)
} `
在结构体方法内部,我们可以访问和操作接收者实例的字段,以及调用其他方法。结构体方法可以帮助我们在特定结构体上定义和封装操作,使得代码更加清晰和可维护。同时,结构体方法也可以带有指针接收者,以实现对结构体实例的修改。
九、JSON处理
在Go语言中,处理JSON是非常常见的操作,Go语言提供了标准库中的encoding/json包,用于处理JSON的编码和解码。该包提供了一组函数和方法,可以将Go语言中的结构体、切片、映射等数据类型和JSON之间进行相互转换。下面是一些常见的JSON处理操作:
- JSON编码:通过将Go语言的数据类型编码为JSON格式的数据,可以使用
json.Marshal或json.MarshalIndent函数。例如:
go type Person struct { Name string json:"name" Age int json:"age"`
}person := Person{Name: "Alice", Age: 30}
jsonData, err := json.Marshal(person)
if err != nil {
fmt.Println("JSON encoding failed:", err)
return
}
fmt.Println(string(jsonData)) // 输出:{"name":"Alice","age":30} `
- JSON解码:通过将JSON格式的数据解码为Go语言的数据类型,可以使用
json.Unmarshal函数。例如:
`go jsonStr := {"name":"Alice","age":30} var person Person err := json.Unmarshal([]byte(jsonStr), &person) if err != nil { fmt.Println("JSON decoding failed:", err) return }
fmt.Println(person.Name, person.Age) // 输出:Alice 30 `