Maison >développement back-end >Golang >Une erreur étrange se produit lors de l'appel de la méthode de structure GoLang

Une erreur étrange se produit lors de l'appel de la méthode de structure GoLang

WBOY
WBOYavant
2024-02-08 22:21:191221parcourir

GoLang 结构体方法调用出现奇怪错误

Éditeur php Youzi peut rencontrer des erreurs étranges lors de l'utilisation du langage de programmation GoLang. L’un d’eux est un problème avec les appels de méthodes de structure. La structure est un type de données courant dans GoLang, qui peut contenir des champs et des méthodes. Cependant, nous rencontrons parfois des erreurs inattendues lors de l’appel des méthodes de structure. Cet article analysera les causes de ces problèmes et proposera des solutions pour vous aider à mieux comprendre et utiliser les structures de GoLang.

Contenu de la question

J'essaie d'apprendre GoLang maintenant, mais j'ai rencontré un problème avec l'une des tâches. Le problème est que je dois définir la méthode Ammo pour une structure qui a des champs Power et Shoot. Cependant, il me tire dessus à la place de l'ennemi imaginaire et donne l'erreur suivante : compiler.go:64:20 : testStruct.Shoot n'est pas défini (type *Hero n'a pas de champ ni de méthode Shoot) J'ai vérifié la documentation et quelques tutoriels et il semble que je déclare la méthode correcte. Mais j'obtiens cette erreur. Voici mon code :

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

Вам необходимо реализовать структуру со свойствами-полями 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!

Solution

Vous êtes confus au sujet des paramètres de fonction et des récepteurs. Essayez ceci, notez où se trouve Hero dans la fonction :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer