Не удается получить доступ к методу из другого пакета с помощью var.MethodName () - PullRequest
0 голосов
/ 25 августа 2018

У меня есть пакет, содержащий некоторую структуру и функции, связанные с ним:

package samplepkg

type SampleStruct struct {
    FirstString string
    SecondString string
}

func init() {
    // some operations
}

func CheckSomething(s *SampleStruct) bool {
    // check something
}

Теперь я пытаюсь запустить эту функцию в другом пакете:

import (
    "MyProject/samplepkg"
)

func testFunc() {
    var s = samplepkg.SampleStruct{"a", "b"}
    if s.CheckSomething() {
        // do some operations
    }
}

Но я получаю ошибку, что s.CheckSomething не определено. (& s). CheckSomething дает тот же результат. Я могу получить доступ к s.FirstString и s.SecondString, а также использовать этот метод, вызывая

if samplepkg.CheckSomething(&s) {
    // do some operations
}

Но я чувствую, что это можно было бы написать лучше. Я знаю, что Go не является объектно-ориентированным языком, но возможен ли такой метод вызова?

1 Ответ

0 голосов
/ 25 августа 2018

В Golang набор методов определяется как:

Тип может иметь набор методов, связанный с ним. Набор методов Тип интерфейса - это его интерфейс. Набор методов любого другого типа T состоит из всех методов, объявленных с типом получателя T. Набор методов соответствующего типа указателя * T - множество всех методов объявляется с получателем * T или T (то есть, он также содержит метод набор T). Дополнительные правила применяются к структурам, содержащим встроенные поля, как описано в разделе о типах структуры. Любой другой тип имеет пустой набор методов. В наборе методов каждый метод должен иметь уникальный непустое имя метода.

Произошла ошибка, поскольку при вызове функции вы используете приемник указателя с методом. Поэтому измените функцию при определении метода как:

func init() {
    // some operations
}

func(s *SampleStruct) CheckSomething() bool {
    // check something
}

Или при вызове метода это должна быть функция с аргументом SampleStruct, которая будет выглядеть как

import (
    "MyProject/samplepkg"
)

func testFunc() {
    var s = &samplepkg.SampleStruct{"a", "b"}
    if CheckSomething(s) {
        // do some operations
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...