Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple constructors in Go / optional parameters?

Tags:

constructor

go

I was wondering if there was a way to implement multiple constructors (with the same function name) in Go, just like you can do in Java. Another option could be to only have one constructor with an optional parameter, but I am not sure how to do that exactly.

This seems similar to what I was trying to do

type Query struct {
    TagsQuery string
    PageQuery string
}

// First Constructor
func NewQuery(TagsQuery string) Query {
    return Query{
        TagsQuery: TagsQuery,
        PageQuery: "0", // default to first page
    }
}

// Second Constructor
func NewQuery(TagsQuery string, PageQuery string) Query {
    return Query{
        TagsQuery: TagsQuery,
        PageQuery: PageQuery,
    }
}

The first constructor takes one argument TagsQuery and defaults PageQuery to 0. The second constructor takes two arguments: TagsQuery and PageQuery.

like image 681
qbuffer Avatar asked May 17 '19 00:05

qbuffer


People also ask

Can Go have optional parameters?

Go does not have optional parameters nor does it support method overloading: Method dispatch is simplified if it doesn't need to do type matching as well.

Can we use optional parameters in a constructor?

The definition of a method, constructor, indexer, or delegate can specify its parameters are required or optional. Any call must provide arguments for all required parameters, but can omit arguments for optional parameters. Each optional parameter has a default value as part of its definition.

How do you make a parameter optional in Golang?

Use the variadic Function to Pass Optional Parameters in Go int) { fmt. Print(nums, " ") total := 0 for _, num := range nums { total += num } fmt. Println(total) } func main() { sum(1, 2) sum(1, 2, 3) nums := []int{1, 2, 3, 4} sum(nums...) }

Does Go have constructors?

There are no default constructors in Go, but you can declare methods for any type. You could make it a habit to declare a method called "Init".


1 Answers

Dave Cheney offered a solution to this problem with functional options:

https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis

So you would accept any number of functions that can modify the struct being created. In your case you could do it just for the optional PageQuery field though as it is a ... parameter it could accept more in the future:

type Query struct {
    TagsQuery string
    PageQuery string
}

// First Constructor
func NewQuery(TagsQuery string, options ...Option) Query {
    query := Query{
        TagsQuery: TagsQuery,
        PageQuery: "0", // default to first page
    }
    // Apply options if there are any, can overwrite default
    for _, option := range options {
        query = option(query)
    }
    return query
}

// Option definition
type Option func(Query) Query

// Function to create Option func to set pageQuery
func WithPageQuery(pageQuery string) Option {
    return func(query Query) Query {
        query.PageQuery = pageQuery
        return query
    }
}

And then to call it:

NewQuery("tags query only")
NewQuery("tags query", WithPageQuery("page query"))
like image 97
Iain Duncan Avatar answered Nov 09 '22 00:11

Iain Duncan