代码之家  ›  专栏  ›  技术社区  ›  Serj.by

结构方法调用的GoLang奇怪错误

  •  0
  • Serj.by  · 技术社区  · 1 年前

    现在正在尝试学习GoLang,其中一项任务有问题。问题是我需要为具有弹药和力量字段的结构定义射击方法。然而,它射杀了我,而不是想象中的敌人,错误如下: compiler.go:64:20:testStruct。射击未定义(类型*英雄没有场地或方法射击) 我检查了一些文档和教程,似乎我很好地声明了这个方法。然而,我得到了这个错误。这是我的代码:

    В рамках этого урока мы постарались представить себе уже привычные нам переменные и функции, как объекты из реальной жизни. Чтобы закрепить результат мы предлагаем вам небольшую творческую задачу.
    
    Вам необходимо реализовать структуру со свойствами-полями On, Ammo и Power, с типами bool, int, int соответственно. У этой структуры должны быть методы: Shoot и RideBike, которые не принимают аргументов, но возвращают значение bool.
    
    Если значение On == false, то оба метода вернут false.
    
    Делать Shoot можно только при наличии Ammo (тогда Ammo уменьшается на единицу, а метод возвращает true), если его нет, то метод вернет false. Метод RideBike работает также, но только зависит от свойства Power.
    
    Чтобы проверить, что вы все сделали правильно, вы должны создать указатель на экземпляр этой структуры с именем testStruct в функции main, в дальнейшем программа проверит результат.
    
    Закрывающая фигурная скобка в конце main() вам не видна, но она есть.
    
    Пакет main объявлять не нужно!
    
    Удачи!
    
    #code tpl:
    func main() {
    
        // testStruct :=
        /*
         * Экземпляр созданной вами структуры необходимо передать в качестве
         * аргумента функции testStruct, которая выполнит проверку соблюдения
         * всех условий задания/
    
    // }
    */
    
    
    package main
    import (
    "fmt"
    )
    
    type Hero struct {
        On bool
        Ammo, Power int
    }
    func Shoot(h Hero) bool {
        if !h.On { return false }
        if h.Ammo>0 {
            h.Ammo--
            return true
        } else {
            return false
        }
    }
    func RideBike(h Hero) bool {
        if !h.On { return false }
        if h.Power>0 {
            h.Power--
            return true
        } else {
            return false
        }
    }
    func main() {
        testStruct := new(Hero)
        testStruct.On = true
        testStruct.Ammo = 10
        testStruct.Power = 100
        fmt.Println (testStruct)
        res := testStruct.Shoot()
        fmt.Println (testStruct)
    }```
    Could you please tell me what I am doing wrong? Thank you! Sorry for my English -it's bot my bative language. Thank you again!
    
    
    2 回复  |  直到 1 年前
        1
  •  2
  •   Tomer S    1 年前

    您混淆了函数自变量和接收器。 请注意Hero在函数中的位置,然后尝试此操作:

    package main
    
    import (
        "fmt"
    )
    
    type Hero struct {
        On          bool
        Ammo, Power int
    }
    
    func (h *Hero) Shoot() bool {
        if !h.On {
            return false
        }
        if h.Ammo > 0 {
            h.Ammo--
            return true
        } else {
            return false
        }
    }
    func (h *Hero) RideBike() bool {
        if !h.On {
            return false
        }
        if h.Power > 0 {
            h.Power--
            return true
        } else {
            return false
        }
    }
    func main() {
        testStruct := new(Hero)
        testStruct.On = true
        testStruct.Ammo = 10
        testStruct.Power = 100
        fmt.Println(testStruct)
        res := testStruct.Shoot()
        fmt.Println(res)
        print(testStruct.Ammo)
    }
    
        2
  •  1
  •   Rohan Warwar    1 年前

    您需要实现结构的方法,但您使用第一个args结构来实现函数。 使用 func (h Hero) Shoot() bool 而不是 func Shoot(h Hero) bool