gogo-map

Go: cannot call pointer method getFirstName on "Struct"


I have a simple struct and receiver. I try to set the map with the struct and then call the receiver.

Like that:

package main

import (
    "fmt"
)

type myStruct struct {
    FirstName string 
    LastName string
}

func (m *myStruct) GetFirstName() string {
    return m.FirstName
}

func (m *myStruct) GetLastName() string {
    return m.LastName
}


func main() {
    


    testMyStruct := myStruct {
        FirstName: "x1",
        LastName: "x2",
    }

    myMapStruct["test2"] = testMyStruct 

     

    fmt.Println(myMapStruct["test2"].GetFirstName())


}

I'm getting this error:

 cannot call pointer method getFirstName on myStruct

Why can I call the receiver method from the map?


Solution

  • As you are passing a receiver pointer ,you have to use pointer to the struct to call it ,Please look at the below code

    package main
    
    import (
        "fmt"
    )
    
    type myStruct struct {
        FirstName string 
        LastName string
    }
    
    func (m *myStruct) GetFirstName() string {
        return m.FirstName
    }
    
    func (m *myStruct) GetLastName() string {
        return m.LastName
    }
    
    
    func main() {
        
    
    
        testMyStruct := &myStruct {
            FirstName: "x1",
            LastName: "x2",
        }
    
      myMapStruct:=make(map[string]*myStruct)
    
        myMapStruct["test2"] = testMyStruct 
    
         
    
        fmt.Println(myMapStruct["test2"].GetFirstName())
    
    
    
    }
    

    See working here

    or You can use like below if passing receiver as value

    package main
    
    import (
        "fmt"
    )
    
    type myStruct struct {
        FirstName string 
        LastName string
    }
    
    func (m myStruct) GetFirstName() string {
        return m.FirstName
    }
    
    func (m myStruct) GetLastName() string {
        return m.LastName
    }
    
    
    func main() {
        
    
    
        testMyStruct := myStruct {
            FirstName: "x1",
            LastName: "x2",
        }
    
      myMapStruct:=make(map[string]myStruct)
    
        myMapStruct["test2"] = testMyStruct 
    
         
    
        fmt.Println(myMapStruct["test2"].GetFirstName())
    
    
    
    }