71 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			71 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								title: Go Methods
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								## Go Methods
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Golang types can have methods. A method is a function with a special argument, the _receiver_.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```go
							 | 
						||
| 
								 | 
							
								type Rectangle struct {
							 | 
						||
| 
								 | 
							
								  height, width int64
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (r Receiver) getArea() int64 {
							 | 
						||
| 
								 | 
							
								  return r.height * r.height
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								r := Rectangle{10, 20}
							 | 
						||
| 
								 | 
							
								r.getArea() // 200
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Here, type `Rectangle` has got a method called `getArea` that returns the area of the rectangle.
							 | 
						||
| 
								 | 
							
								The receiver here is `r`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This code is equivalent to:
							 | 
						||
| 
								 | 
							
								```go
							 | 
						||
| 
								 | 
							
								type Rectangle struct {
							 | 
						||
| 
								 | 
							
								  height, width int64
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func getArea(r Receiver) int 64{
							 | 
						||
| 
								 | 
							
								  return r.height * r.height
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								r := Rectangle{10, 20}
							 | 
						||
| 
								 | 
							
								getArea(r) // 200
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								Now the getArea method receives `r` as an argument, instead of a receiver. The functionality is equivalent.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Pointer receiver
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can pass a pointer as a receiver:
							 | 
						||
| 
								 | 
							
								```go
							 | 
						||
| 
								 | 
							
								type MyInt int64
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (m *MyInt) setToZero() {
							 | 
						||
| 
								 | 
							
								  *m = MyInt(0)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								m := MyInt(10)
							 | 
						||
| 
								 | 
							
								m.setToZero() // m == 0
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Extension methods
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you want to create a method on a type defined in other package, e.g. `int` you can use a simple wrapper like this:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```go
							 | 
						||
| 
								 | 
							
								type MyInt int64
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (m MyInt) add10() int64 {
							 | 
						||
| 
								 | 
							
								  return m + 10
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								m := MyInt(10)
							 | 
						||
| 
								 | 
							
								m.add10() // 20
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### More Information:
							 | 
						||
| 
								 | 
							
								<!-- Please add any articles you think might be helpful to read before writing the article -->
							 | 
						||
| 
								 | 
							
								https://tour.golang.org/methods/1
							 |