wtysos11 / blogWiki

Use to store public paper and organize them.
17 stars 4 forks source link

golang中方法的receiver可以为自定义类型的问题 #210

Open wtysos11 opened 3 years ago

wtysos11 commented 3 years ago

今天在阅读go-redis源代码的时候发现了这个用法,即使用一个函数(而不是结构体)可以作为receiver。 地址:github.com/go-redis/redis/v8/commands.go

写了一个小demo

package main

import (
    "fmt"
    "strconv"
)

type cmdable func(a int) string

func (c cmdable) Test(b int) string{
    str1 := c(b+5)
    return "test" + str1
}

func main() {
    var a cmdable = func(a int) string {
        return strconv.Itoa(a)
    }
    fmt.Println(a.Test(5))
    b := func(a int) string {
        return strconv.Itoa(a)
    }
    //b.Test(6)
    var c cmdable = b
    fmt.Println(c.Test(7))
}

上述代码是可以运行的,b中的数据需要通过一个显式的类型转换才能够执行。

问题在于:receiver是什么?

扩展问题:接口能否作为receiver https://stackoverflow.com/questions/45652560/interfaces-and-pointer-receivers