title: Getter and Setter conventions in Go
body: <p><strong>Case A</strong> Not following the Getter &amp; Setter convention</p>
  
  <p>human/human.go</p>
  
  <pre><code>package human
  
  type Human interface {
      GetName() string
      SetName(name string)
  }
  
  type Person struct {
      Name string
  }
  
  func (p Person) GetName() string {
      return p.Name
  }
  
  func (p *Person) SetName(name string) {
      p.Name = name
  }
  </code></pre>
  
  <p>main/main.go</p>
  
  <pre><code>package main
  
  func main() {
      john := Person{Name:"john"} // Uppercase Fields are visible
      fmt.Println(john)
  }
  </code></pre>
  
  <hr>
  
  <p><strong>Case B</strong> Following getter and setter convention</p>
  
  <pre><code>package human
  
  type Human interface {
      Name() string
      SetName(name string)
  }
  
  type Person struct {
      name string
  }
  
  func (p Person) Name() string {
      return p.name
  }
  
  func (p *Person) SetName(name string) {
      p.name = name
  }
  </code></pre>
  
  <p>main/main.go</p>
  
  <pre><code>package main
  
  func main() {
      john := Person(name: "John") // lowercase name is not visible outside the package
  }
  </code></pre>
  
  <p>The problem with following convention is that I can't instantiate the struct while providing its field names. I'd like to use the convention but I am stuck with the private access.</p>