Go Language Object Oriented Programming: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
 
(3 intermediate revisions by the same user not shown)
Line 18: Line 18:


=<span id='Method'></span>Methods=
=<span id='Method'></span>Methods=
<font color=darkkhaki>
{{Internal|Go_Methods#Overview|Go Methods}}
==Dot Notation works with Both Values and Pointers==
The Go compiler knows how to use the dot notation with both values and pointers.
 
There is no need to invoke a method defined with a pointer receiver type with:
<syntaxhighlight lang='go'>
(&variable).SomeMethod()
</syntaxhighlight>
This will work:
<syntaxhighlight lang='go'>
variable.SomeMethod()
</syntaxhighlight>
Similarly, inside the method, there is no need to dereference the pointer receiver type parameter:
<syntaxhighlight lang='go'>
func (v *SomeType) SomeMethod(...) {
  (*v).someField // not necessary
}
</syntaxhighlight>
This will work:
<syntaxhighlight lang='go'>
func (v *SomeType) SomeMethod(...) {
  v.someField
}
</syntaxhighlight>
 
==Mixing Value and Pointer Receiver Types==
When using pointer receivers, it is good programming practice to have all method use pointer receivers, or none of them use pointer receivers. If we mix value and pointer receivers, the IDE would detect that as static check warning:
 
<font size=-2>
  Struct Color has methods on both value and pointer receivers. Such usage is not recommended by the Go Documentation.
</font>
 
==Functions as Receiver Types==
 
<font color=darkkhaki>TODO: https://go.dev/blog/error-handling-and-go#simplifying-repetitive-error-handling</font>
</font>


=Encapsulation=
=Encapsulation=

Latest revision as of 00:08, 2 September 2024

External

Internal

Overview

Go is an object-oriented language, but the object orientation programming model is relatively simple, compared with other object-oriented languages. It has been said about Go that is "weakly" object-oriented. Go does not use the term "class", there is no class keyword in the language. However, Go allows associating data with methods, which what a class in other programming languages really is.

Go provides syntax to associate an arbitrary local type with arbitrary functions, turning them into methods of that type. The local type can be a type alias, a struct or a function. In this context, "local" means a type that is defined in the same package as the function. That is why a programmer cannot add new methods to built-in types.

The most common pattern for implementing object-orientation is to use a struct as data encapsulation mechanism, optionally declaring fields as unexported, thus preventing direct access to them from outside the package, and then associating the struct with functions, by declaring the struct type as the receiver type for those functions. The functions become methods of the type. This construct is the closest equivalent to a class in other programming languages. The standard dot notation is then used to call a method on the instance of the receiver type.

Go does offer inheritance, overriding and polymorphism in the language syntax the same way other OOP languages do, but these features are available and can be implemented with a combination of struct field embedding and interfaces. See:

Go Inheritance and Polymorphism

Methods

Go Methods

Encapsulation

Encapsulation in this context is giving access to private data, such as package-internal data or private struct fields, via public methods. This way, access to data is controlled.

Encapsulation can be implemented with package data and with structs, where the "private" fields are declared using identifiers that start with lower cap letters, so they are not visible outside the package. Controlled access to them is given via accessor and mutator methods, or getters and setters, which are functions that have been declared to use the struct as a receiver type:

type Color struct {
	color string
}

func (c *Color) Init(color string) {
	c.SetColor(color)
}

func (c *Color) Color() string {
	return (*c).color
}

func (c *Color) SetColor(color string) {
	(*c).color = color
}

...

var c Color
c.Init("blue")
fmt.Println(c.Color()) // prints blue
c.SetColor("red")
fmt.Println(c.Color()) // prints red

Interfaces

Go Interfaces

Inheritance and Polymorphism

Go Inheritance and Polymorphism