04.函数进阶
在 Go
语言中,函数是编程的核心,它们帮助你组织和重复使用代码。
我们已经了解了基础的函数用法,现在让我们探索一些更高级的特性。🚀
匿名函数
匿名函数是没有名字的函数,你可以直接在需要的地方定义和使用它们。
它们特别有用于实现闭包(closures
)和即时调用的函数。
这里是一个匿名函数的例子:
// 匿名函数
func() {
fmt.Println("我是一个匿名函数!")
}()
注意这个函数后面的 ()
,它表示我们定义了匿名函数并立即调用它。
闭包
闭包是一种特殊的匿名函数,它可以访问定义它的函数的作用域中的变量。
这允许你创建能够保有状态的函数:
adder := func(start int) func(int) int {
sum := start
return func(x int) int {
sum += x
return sum
}
}
myAdder := adder(10)
fmt.Println(myAdder(5)) // 输出 15
fmt.Println(myAdder(10)) // 输出 25
在上面的例子中,adder
是一个函数,它返回另一个函数。
返回的函数能够记住并使用 adder
函数中的 sum
变量。
递归
递归是函数自己调用自己的过程。
这在处理像树结构这样的数据结构时非常有用。
以下是一个计算阶乘的递归函数:
func factorial(n int) int {
if n == 0 {
return 1
}
return n * factorial(n-1)
}
fmt.Println(factorial(5)) // 输出 120
这个 factorial
函数不断地调用自己直到达到基本情况(n
等于 0
)。
通过这些高级功能,你可以编写更复杂和强大的 Go
程序。
接收者
package main
import "fmt"
func main() {
p := Person{
Name: "张三",
Age: 24,
}
// 值接收者
p.setInfo()
fmt.Println(p.Name)
// 指针接收者
p.sayHai()
fmt.Println(p.Name)
}
type Person struct {
Name string
Age int
}
// 值接收者(Person),传递的是拷贝的数据,修改数据不会修改原始数据
func (xx Person) setInfo() {
fmt.Println("通过结构体调用 值接收者 方法。")
xx.Name = "李四" // 值接收者方式,这个赋值不会生效
}
// 指针接收者(*Person)
func (xx *Person) sayHai() {
fmt.Println("通过结构体调用 指针接收者 方法。")
xx.Name = "李四" // 指针接收者方式,这个赋值会生效
}
运行结果
encoding-json
包
struct
转 json
package main
import (
"encoding/json"
"fmt"
)
func main() {
// 初始化结构体
s1 := Student{
ID: 1,
Name: "张三",
Age: 25,
Address: "北京",
}
fmt.Println(s1)
// 将结构体转换为 json 数据
/*
json.Marshal(s1) 返回两个值
一个是 []byte对象(将结构体转换出来的数据)
一个是 err,当转换出错的时候通过 err 接收错误信息
*/
s2, err := json.Marshal(s1)
if err != nil {
fmt.Println(err)
}
// 使用 string 方法转换为人类可读的 string 形式
fmt.Println(string(s2))
}
// 定义结构体
type Student struct {
ID int
Name string
Age int
Address string
}
运行结果
json
转 struct
package main
import (
"encoding/json"
"fmt"
)
func main() {
// 结构体对应的 json 字符串数据
s := `{"ID":1,"Name":"张三","Age":25,"Address":"北京"}`
// 将 json 转换为 struct
var stu Student
// 将 string 类型的数据转换为一个 []byte 类型数据
s1 := []byte(s)
json.Unmarshal(s1, &stu)
fmt.Println(stu)
fmt.Println(stu.Name, stu.Age)
}
// 定义结构体
type Student struct {
ID int
Name string
Age int
Address string
}
运行结果
tag
结构体转 json
package main
import (
"encoding/json"
"fmt"
)
func main() {
s1 := Student{
Name: "张三",
Age: 24,
}
s2, _ := json.Marshal(s1)
fmt.Println(string(s2))
}
type Student struct {
// 打标签,类似起个别名
Name string `json:"名字"`
Age int `json:"年龄"`
}
运行结果
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
Linux 小白鼠!
觉得文章不错,打赏一点吧,1分也是爱~
打赏
微信
支付宝