Можем ли мы иметь указатели на функции в Go? - PullRequest
47 голосов
/ 30 августа 2010

Я изучал указатели в Go. И удалось написать что-то вроде:

func hello(){

       fmt.Println("Hello World")
}

func main(){

       pfunc := hello     //pfunc is a pointer to the function "hello"
       pfunc()            //calling pfunc prints "Hello World" similar to hello function
}

Есть ли способ объявить указатель на функцию, не определяя ее, как сделано выше? Можем ли мы написать что-то похожее на C?

например. void (*pfunc)(void);

Ответы [ 4 ]

67 голосов
/ 30 августа 2010

Работает, если вы используете подпись.Указатель отсутствует.

type HelloFunc func(string)

func SayHello(to string) {
    fmt.Printf("Hello, %s!\n", to)
}

func main() {
    var hf HelloFunc

    hf = SayHello

    hf("world")
}

В качестве альтернативы вы можете использовать подпись функции напрямую, без объявления нового типа.

31 голосов
/ 13 сентября 2010

Go не имеет такой же синтаксис для указателей на функции, как C и C ++.Это довольно хорошее объяснение этому в блоге Go .Понятно, что авторы Go считали синтаксис C для указателей на функции слишком похожим на обычные указатели, поэтому вкратце они решили сделать указатели на функции явными;то есть более читабельный.

Вот пример, который я написал.Обратите внимание, как параметр fp определен в calculate() и другом примере ниже, который показывает вам, как вы можете сделать указатель функции на тип и использовать его в функции (функция вычисления с комментариями).

Параметр fp определяется как функция, которая принимает два целых числа и возвращает одно целое.Это то же самое, что упоминалось Mue , но показывает другой пример использования.

5 голосов
/ 01 декабря 2014

Вы можете сделать это так:

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()            
}

Если ваша функция имеет аргументы и, например, возвращаемое значение, она будет выглядеть следующим образом:

func hello(name string) int{

       fmt.Println("Hello %s", name)
       return 0
}

и переменная будет выглядеть так:

  var pfunc func(string)int
0 голосов
/ 08 марта 2019

Другой подход к этому - определить интерфейс

type command interface {
      DoLoop()
}

реализовать структуру, которая его реализует

type Delete struct {
      instance string
}

func (dev Delete) DoLoop() {
      fmt.Println("input: delete ")
}

Создать карту, которая содержит структуру

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

вызов функции

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

Это немного косвенно, но работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...