bGZo 's blog

重构 TG 机器人

不懂的点(学习笔记)

Golang 跑测试

go test ./internal/service/syncservice

为啥可以直接测试?测试在另一个文件里面 service_test.go?

==猜测是按文件夹测试==

Golang 的接口实现

比较变态,没有显示声明,差点没看出来是 Provider 是 Service 的接口实现。

如果想实现一个接口,能否快速生成这个接口的全部方法?要不然还得反过头来反复查找,感觉如果没有这个语法糖有点坐牢,而且没有显示声明,也不容易分辨接口实现。

via: https://draven.co/golang/docs/part2-foundation/ch04-basic/golang-interface/

Golang make 构造数据结构

via:https://draven.co/golang/docs/part2-foundation/ch05-keyword/golang-make-and-new/

Golang 编程模式

管道基础用法:

package main

import (
	"fmt"
)

// 生成整数序列的函数
// `gen` 函数生成一个通道并返回,它使用一个 goroutine 来将输入的整数序列写入通道中
func gen(nums ...int) <-chan int {
	out := make(chan int)
	go func() {
		defer close(out)
		for _, n := range nums {
			out <- n
		}
	}()
	return out
}

// 对整数进行平方操作的函数
// `square` 函数接收一个整数类型的通道作为输入,对每个输入的整数进行平方操作,并将结果写入一个新的整数类型的通道中
func square(in <-chan int) <-chan int {
	out := make(chan int)
	go func() {
		defer close(out)
		for n := range in {
			out <- n * n
		}
	}()
	return out
}

// 对整数进行求和操作的函数
// `sum` 函数接收一个整数类型的通道作为输入,对其中的整数进行求和操作,并返回求和的结果
func sum(in <-chan int) int {
	sum := 0
	for n := range in {
		sum += n
	}
	return sum
}

func main() {
	// 生成整数序列
	nums := gen(2, 3, 4)

	// 对整数进行平方操作
	sq := square(nums)

	// 对整数进行求和操作
	res := sum(sq)

	fmt.Println(res) // 输出 29
}

进阶用法:

// 一个代理函数
type EchoFunc func ([]int) (<- chan int)
type PipeFunc func (<- chan int) (<- chan int)

func pipeline(nums []int, echo EchoFunc, pipeFns ... PipeFunc) <- chan int {
  ch  := echo(nums)
  // pipeFns 这里是切片,所以i 是索引
  for i := range pipeFns {
	  // 把当前的 channel ch 传给第 i 个处理函数
	  // 这个处理函数会返回一个"新的 channel"
	  // 用新的 channel 覆盖旧的 ch
    ch = pipeFns[i](ch)
  }
  return ch
}

var nums = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
// range 的对象只有一个:最终返回的 channel
// pipeline 这里是管道,所以结果是最终管道流出的值
for n := range pipeline(nums, gen, odd, sq, sum) {
    fmt.Println(n)
}

上下两个 range 行为不一致,是 golang 的「多态语法」,并不是「统一抽象」,range 在切片中代表索引,在 channel 中代表终点值,更多关于 range 的语法参考: https://www.runoob.com/go/go-range.html

via: (8/10) https://coolshell.cn/articles/21228.html;https://www.bilibili.com/read/cv23233345