双向循环链表
package main
import (
"container/ring"
"fmt"
)
func main() {
//创建5个长度的双向循环链表
r := ring.New(5)
r.Value = 1
//下一个节点的值
r.Next().Value = 2
//2的下一个节点的值
r.Next().Next().Value = 3
//1的前一个节点 值
r.Prev().Value = 4
//4的前一个节点的值
r.Prev().Prev().Value = 5
//遍历双向循环链表 1-2-3-5-4
r.Do(func(a any) {
fmt.Println(a)
})
fmt.Println()
//移动到哪里 从根节点1开始 移动3步 到5这里
fmt.Println(r.Move(3).Value)
//1个链表的容量
r1 := ring.New(1)
r1.Value = 9
//把r1的链表加入到r中 也就是加入到1后面
r.Link(r1)
fmt.Println()
//1-9-2-3-5-4
r.Do(func(a any) {
fmt.Println(a)
})
//删除1后面的的1个节点
r.Unlink(1)
fmt.Println("=====================")
r.Do(func(a any) {
fmt.Println(a)
})
}
函数/方法调用
package main
import "fmt"
func main() {
//方法调用 函数调用
aa()
bb(1)
k := cc(1, 2)
y := dd(2, 3)
fmt.Println(k)
fmt.Println(y)
}
// 自定义函数的名称 方法的名称 无参方法
func aa() {
fmt.Println("我是无参方法")
}
func bb(a int) {
fmt.Println("我是有参方法,参数是:", a)
}
func cc(a int, b int) int {
fmt.Println("我是有返回值的方法")
return a + b
}
func dd(a, b int) (s int) {
s = a + b
fmt.Println("我是有返回值的方法,返回值设置成了s,那么在return 后面就不需要加了")
return
}
多返回值方法
package main
import "fmt"
func main() {
a, b := aa()
fmt.Println(a, b)
//如果不想写字段的话 可以使用_ 来做占位
c, _ := aa()
fmt.Println(c)
}
// 多返回值方法 /函数
func aa() (name string, age int) {
name = "张三"
age = 18
return
}
可变值方法,用3个点来表示
package main
import "fmt"
func main() {
aa("张三", "李四")
}
// 可变值方法 可以传多个参数
func aa(str ...string) {
for i, n := range str {
fmt.Println(i, n)
}
}
匿名函数
package main
import "fmt"
func main() {
//匿名函数 就是不需要写方法名
func() {
fmt.Println("我是无参匿名函数")
}() //括号调用匿名函数 必须在} 之后调用括号
func(name string) {
fmt.Println("我是有参匿名函数", name)
}("张三")
pwd := func() string {
fmt.Println("我是有返回值的匿名函数")
return "123456"
}()
fmt.Println(pwd)
}
函数变量
package main
import "fmt"
func main() {
//函数变量 先定义一个函数变量
var a func()
//然后再给函数变量赋值 一个方法
a = func() {
fmt.Println("aaaaaaaaaa")
}
//最后调用函数变量的 方法
a()
//也可以等于另一个方法
a = b
a()
}
func b() {
fmt.Println("bbbbbbbbb")
}
方法里面传方法
package main
import "fmt"
func main() {
//在方法里面 传入一个方法
b(func(name string) {
fmt.Println("name是:", name)
})
}
func b(arg func(name string)) {
fmt.Println("传入的是一个方法")
//调用方法 给name赋值
arg("张三")
}
函数作为返回值
package main
import "fmt"
func main() {
//b是一个地址
b := a()
//调用b方法 赋值给新的变量
c := b()
//这里的c 才能真正的打印100
fmt.Println(c)
}
// 函数作为返回值 int类型的返回值方法
func a() func() int {
return func() int {
//返回100
return 100
}
}
挎包调用
package main
import "godemo/src/demo"
func main() {
//必须是大写才能调用
demo.D2()
}
package demo
import "fmt"
func D2() {
fmt.Println("我是d2")
}
在main.go调用其他包下面的方法的时候,其他包提供的方法开头字母必须是大写
全局变量
package main
import "fmt"
//定义全局变量
var (
name = "张三"
age = 18
)
func main() {
fmt.Println(name, age)
}