Can we have function pointers in Go?

前端 未结 5 1558
甜味超标
甜味超标 2021-01-30 12:32

I was learning about pointers in Go. And managed to write something like:

func hello(){

       fmt.Println(\"Hello World\")
}

func main(){

       pfunc := hel         


        
相关标签:
5条回答
  • 2021-01-30 13:13

    It works if you're using the signature. There's no pointer.

    type HelloFunc func(string)
    
    func SayHello(to string) {
        fmt.Printf("Hello, %s!\n", to)
    }
    
    func main() {
        var hf HelloFunc
    
        hf = SayHello
    
        hf("world")
    }
    

    Alternatively you can use the function signature directly, without declaring a new type.

    0 讨论(0)
  • 2021-01-30 13:13

    You could do it like this:

    package main
    
    import "fmt"
    
    func hello(){
    
           fmt.Println("Hello World")
    }
    
    func main(){
           var pfunc func()
           pfunc = hello     //pfunc is a pointer to the function "hello"
           pfunc()            
    }
    

    If your function has arguments and e.g. a return value, it would look like:

    func hello(name string) int{
    
           fmt.Println("Hello %s", name)
           return 0
    }
    

    and the variable would look like:

      var pfunc func(string)int
    
    0 讨论(0)
  • 2021-01-30 13:26

    A different way to approach it is to define an interface

    type command interface {
          DoLoop()
    }
    

    implement a struct that implements it

    type Delete struct {
          instance string
    }
    
    func (dev Delete) DoLoop() {
          fmt.Println("input: delete ")
    }
    

    Create map that contains the struct

     mainFuncTable = make(map[string]command)
     mainFuncTable["delete"] = Delete{"new"}
    

    the call the function

    func route(command string) {
          cmd := mainFuncTable[command]
          cmd.DoLoop()
    }
    

    It's a little indirect but it works

    0 讨论(0)
  • 2021-01-30 13:28

    A function is also a type in Go. So you can essentially create a variable of type func signature. So following would work;

    var pfunc func(string)
    

    This variable can point to any function that take string as argument and returns nothing. Following piece of code works well.

    package main
    
    import "fmt"
    
    func SayHello(to string) {
        fmt.Printf("Hello, %s!\n", to)
    }
    
    func main() {
        var pfunc func(string)
    
        pfunc = SayHello
    
        pfunc("world")
    }
    
    0 讨论(0)
  • 2021-01-30 13:34

    Go doesn't have the same syntax for function pointers as C and C++ do. There's a pretty good explanation for that on the Go blog. Understandably the Go authors thought C's syntax for function pointers too similar to regular pointers, so in short they decided to make function pointers explicit; i.e. more readable.

    Here's an example I wrote. Notice how the fp parameter is defined in calculate() and the other example below that shows you how you can make a function pointer into a type and use it in a function (the commented calculate function).

    package main
    
    import "fmt"
    
    type ArithOp func(int, int)int
    
    func main() {
        calculate(Plus)
        calculate(Minus)
        calculate(Multiply)
    }
    
    func calculate(fp func(int, int)int) {
        ans := fp(3,2)
        fmt.Printf("\n%v\n", ans) 
    }
    
    // This is the same function but uses the type/fp defined above
    // 
    // func calculate (fp ArithOp) {
    //     ans := fp(3,2)
    //     fmt.Printf("\n%v\n", ans) 
    // }
    
    func Plus(a, b int) int {
        return a + b
    }
    
    func Minus(a, b int) int {
        return a - b
    }
    
    func Multiply(a,b int) int {
        return a * b
    }
    

    The fp parameter is defined as a function that takes two ints and returns a single int. This is somewhat the same thing Mue mentioned but shows a different usage example.

    0 讨论(0)
提交回复
热议问题