| 
             Go supports methods defined on struct types. 
           | 
          
            
          
           | 
        
        
        
          | 
             see pointer vs. value receiver 
           | 
          
            
          
           | 
        
        
        
          | 
            
           | 
          
              
          package main
 
           | 
        
        
        
          | 
            
           | 
          
            
          import "fmt"
 
           | 
        
        
        
          | 
            
           | 
          
            
          type user struct {
    name  string
    email string
}
           | 
        
        
        
          | 
             value receiver will only works on the copy of struct 
           | 
          
            
          
func (u user) notify() {
    fmt.Printf("Sending email to %s<%s>\n", u.name, u.email)
           | 
        
        
        
          | 
             will not change because this method is a value receivere.
warning: ineffective assignment to field user.name 
           | 
          
            
          
    u.name = "will not change"
}
           | 
        
        
        
          | 
             will de-reference to (*u).email under the hood 
           | 
          
            
          func (u *user) changeEmail(email string) {
           | 
        
        
        
          | 
            
           | 
          
            
              u.email = email
}
 
           | 
        
        
        
          | 
            
           | 
          
            
          func main() {
    ua := user{name: "Tom", email: "tom@gmail.com"}
    ub := user{name: "Ben", email: "ben@gmail.com"}
    ua.notify()
    fmt.Println("ua.name", ua.name)
    ua.changeEmail("tom@newdomain.com")
    fmt.Println("ua.email", ua.email)
    ub.changeEmail("ben@newdomain.com")
    fmt.Println("ub.email", ub.email)
}
           |