Dmytro Sadovnychyi
Dmytro Sadovnychyi

Reputation: 6201

Adding a method for existing type in Golang: how to rewrite return value's type

I want to extend existing goquery.Selection type with my own method and be able to use it from package's selectors. I know that I cannot "patch" existing method -- I need to create a new one. But how do I can force the existing package functions to use my new type? Something I'm missing in general or there's no "nice" way to do it and it's better to use a function?

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
)

type customSelection goquery.Selection

func (s *customSelection) CustomMethod() int {
    return 1
}

doc.Find("*").Each(func(i int, s *goquery.Selection) {
  fmt.Println(s.CustomMethod())  // does not works since its still "goquery.Selection"
  // how do I can get a result with customSelection type here? 
})

Upvotes: 0

Views: 1164

Answers (2)

kostya
kostya

Reputation: 9559

You can use function instead of method:

func customFunc(s *goquery.Selection) int {
    return 1
}

...

fmt.Println(customFunc(s)) 

Upvotes: 1

FuzzyAmi
FuzzyAmi

Reputation: 8119

Since inheritance is not supported, the best practice is to embed the non-local type into your own local type, and extend it.

In the Design Patterns lingo its better known as composition: https://en.wikipedia.org/wiki/Composition_over_inheritance

Upvotes: 3

Related Questions