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 = "李四" // 指针接收者方式,这个赋值会生效
}

运行结果

image.png


encoding-json

structjson

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
}

运行结果

image.png

jsonstruct

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
}

运行结果

image.png

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:"年龄"`
}

运行结果

image.png


文章作者: Runfa Li
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Linux 小白鼠
GO GO 入门 go
觉得文章不错,打赏一点吧,1分也是爱~
打赏
微信 微信
支付宝 支付宝