代码之家  ›  专栏  ›  技术社区  ›  Neekoy

Golang在另一个模块中无法访问map的属性

go
  •  -1
  • Neekoy  · 技术社区  · 5 月前

    当我在一个文件中执行所有操作时,它会工作:

    package main
    
    import (
        "fmt"
    )
    
    type Card struct {
        name     string
        strenght int
    }
    
    func main() {
        var cardsInPlay []Card
    
        var aragornCard Card
        aragornCard.name = "Aragorn"
    
        cardsInPlay = append(cardsInPlay, aragornCard)
    
        fmt.Print(cardsInPlay[0].name)
    }
    

    以上工作,我得到以下输出:

    $go运行main.go
    阿拉贡

    然而,当我将其拆分为两个文件时,我遇到了一个错误:

    main.go :

    package main
    
    import (
        "fmt"
        "example.com/cards"
    )
    
    func main() {
        var cardsInPlay []cards.Card
        cardsInPlay = cards.GetCards()
    
        fmt.Print(cardsInPlay[0].name)
    }
    

    卡片走 :

    package cards
    
    type Card struct {
        name          string
    }
    
    var cardSet []Card
    
    func GetCards() []Card {
        var aragornCard Card
        aragornCard.name = "Aragorn"
    
        cardSet = append(cardSet, aragornCard)
    
        return cardSet
    }
    

    当它被拆分为两个文件时,我收到以下错误:

    $go运行main.go
    #命令行参数
    .\main.go:35:27:cardsInPlay[0].name未定义(键入cards.Card没有字段或方法名)

    我的类型卡。卡片上肯定有“姓名”字段。奇怪。

    为什么会这样?请帮帮我。

    1 回复  |  直到 5 月前
        1
  •  1
  •   basic197    5 月前

    在Go中,要使struct字段在包外可访问,字段名必须以大写字母开头。这被称为导出字段。

    在您的原始cards.go文件中,Card结构体的name字段没有大写,这意味着它没有导出,也无法在包外访问。要解决此问题,您应该更改 名称 姓名 。这将导出该字段,允许其他包访问它。

    卡片走

    package cards
    
    type Card struct {
        Name string // Updated to capitalize the first letter for exporting
    }
    
    var cardSet []Card
    
    func GetCards() []Card {
        var aragornCard Card
        aragornCard.Name = "Aragorn" // Updated to use the capitalized field name
    
        cardSet = append(cardSet, aragornCard)
    
        return cardSet
    }
    

    main.go

    package main
    
    import (
        "fmt"
        "example.com/cards" 
    )
    
    func main() {
        var cardsInPlay []cards.Card
        cardsInPlay = cards.GetCards()
    
        fmt.Println(cardsInPlay[0].Name) // Accessing the exported 'Name' field
    }
    

    更改后,Card结构中的Name字段现在可以在main.go文件中访问。如需更多示例,请随时查看Go中导出名称的教程: https://go.dev/tour/basics/3