Типы функций в Go - PullRequest
       0

Типы функций в Go

0 голосов
/ 29 апреля 2018

Я пытаюсь понять типы функций в Go, поэтому я попытался с помощью приведенного ниже кода.

package main

import "fmt"

func myfn1(i string) {
    fmt.Println(i)
}

func myfunc2(firstName string, lastName string) string {
    return "Hello "+ firstName + " " + lastName + "!"
}

func test(do func(string), val string) {
    do(val)
}

func test1(t func(string,string), fname string, lname string) string {
  opt := t(fname, lname)
  return opt
}

func main() {
    test(myfn1, "Aishu")
    greet := test1(myfunc2, "Aishu","S")
    fmt.Println(greet)
}

И выдает ошибку ниже.

  1. t (fname, lname) используется в качестве значения
  2. не может использовать myfunc2 (тип func (строка, строка) строка) в качестве типа func (строка, строка) в аргументе для test1

Я не уверен, что делаю не так.

Детская площадка

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

У вас есть две не связанные проблемы.

Первый:

  1. t (fname, lname) используется в качестве значения

Это то, что вы пытаетесь присвоить возвращаемое значение t(fname, lname) переменной, но t() ничего не возвращает.

Второй:

  1. не может использовать myfunc2 (тип func (строка, строка) строка) в качестве типа func (строка, строка) в аргументе для test1

Это довольно очевидно. Вы пытаетесь передать функцию, которая возвращает строку func(string, string) string, в функцию, которая ожидает функцию, которая ничего не возвращает func(string, string).

0 голосов
/ 29 апреля 2018

Типы функций описаны в Golang Spec как:

Тип функции обозначает набор всех функций с одинаковыми параметры и типы результатов.

Здесь четко указано, что функция с same parameter and result types

Существуют различные определения функций, которые вы передаете своей основной программе, и определения, которые требуются вашей функции. Если вы внимательно посмотрите на функцию ниже, вы передали t в качестве аргумента test1, который ничего не возвращает, но вы присваиваете его значение opt, поэтому ошибка.

t (fname, lname) используется в качестве значения

Для второй ошибки, которая говорит:

не может использовать myfunc2 (тип func (string, string) string) в качестве типа func (строка, строка) в аргументе для test1

С тех пор, как, если вы посмотрите на тип функции, которую вы передаете test1 в качестве аргумента, и тип аргумента, который вы определили в test1, различаются.

Пожалуйста, проверьте ниже рабочий код.

package main

import "fmt"


func myfn1(i string) {
    fmt.Println(i)
}

func myfunc2(firstName string, lastName string) string{

return "Hello "+ firstName + " " + lastName + "!"


}

func test(do func(string), val string){
do(val)
}


func test1(t func(string,string) string, fname string, lname string) string{

  opt := t(fname,lname)
  return opt
}


func main() {
    test(myfn1, "Aishu")
     greet := test1(myfunc2, "Aishu","S")
     fmt.Println(greet)

}

Детская площадка Пример

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