How to pass default parameter to golang function?


Written By - Tuan Nguyen
Advertisement

Some programming languages (such as python) allow function arguments to have default values. If the function is called without the argument, the argument gets its default value. For example:

def name(firstname, lastname ='Mark', standard ='Fifth'):
     print(firstname, lastname, 'studies in', standard, 'Standard')
 
# 1 positional argument
name('John')
 
# 3 positional arguments                        
name('John', 'Gates', 'Seventh')    
 
# 2 positional arguments 
name('John', 'Gates')                 
name('John', 'Seventh')

Unfortunately, default arguments are not supported by Go. We still can have some other options to implement setting default value for function parameters. Let's look at the below example:

 

Example 1: Golang pass nil as an argument

In the below example, if the parameter is zero value, set it with the default value:

package main

import "fmt"

func main() {
	fmt.Println(GetStudentInfo("", ""))
	fmt.Println(GetStudentInfo("Anna", ""))
	fmt.Println(GetStudentInfo("", "+145366"))
}

func GetStudentInfo(name string, phoneNumber string) string {
	if name == "" {
		name = "default-name"
	}

	if phoneNumber == "" {
		phoneNumber = "default-phoneNumber"
	}

	return fmt.Sprintf("Name: %s, Phone number: %s", name, phoneNumber)
}

Output:

Name: default-name, Phone number: default-phoneNumber
Name: Anna, Phone number: default-phoneNumber
Name: default-name, Phone number: +145366

 

Example 2: Golang ... parameter in variadic functions

In the below section, we have an article about variadic functions. Here is an example of using the variadic functions to set a default value for parameters:

package main

import "fmt"

func main() {
	fmt.Println(GetStudentInfo2("Anna"))
	fmt.Println(GetStudentInfo2("Teddy", "+3688269"))
	fmt.Println(GetStudentInfo2("Adele", "+145366", "+58963144"))
}

// name is required, phoneNumber is optional. Only the first value in phoneNumber_optional can be used.
func GetStudentInfo2(name string, phoneNumber_optional ...string) string {
	phoneNumber := "default-phoneNumber"
	if len(phoneNumber_optional) > 0 {
		phoneNumber = phoneNumber_optional[0]
	}

	return fmt.Sprintf("Name: %s, Phone number: %s", name, phoneNumber)
}

Output:

Name: Anna, Phone number: default-phoneNumber
Name: Teddy, Phone number: +3688269
Name: Adele, Phone number: +145366

 

Example 3: Putting all params in a struct

Here is an example of using a struct as the parameter and we can set the default value for fields in the struct:

package main

import (
	"fmt"
	"reflect"
)

func main() {
	fmt.Println(GetStudentInfo3(Param{"Anna", ""}))
	fmt.Println(GetStudentInfo3(Param{"Teddy", "+3688269"}))
	fmt.Println(GetStudentInfo3(Param{"", ""}))
}

type Param struct {
	Name        string `default:"default-name"` // setting default value for field
	PhoneNumber string `default:"default-phoneNumber"`
}

func GetStudentInfo3(prm Param) string {
	//type of interface value passed to it
	typ := reflect.TypeOf(prm)

	if prm.Name == "" {
		// returns the struct field with the given parameter "Name"
		f, _ := typ.FieldByName("Name")
		// get default value of Name field
		prm.Name = f.Tag.Get("default")
	}

	if prm.PhoneNumber == "" {
		f, _ := typ.FieldByName("PhoneNumber")
		prm.PhoneNumber = f.Tag.Get("default")
	}

	return fmt.Sprintf("Name: %s, Phone number: %s", prm.Name, prm.PhoneNumber)
}

Output:

Advertisement
Name: Anna, Phone number: default-phoneNumber
Name: Teddy, Phone number: +3688269
Name: default-name, Phone number: default-phoneNumber

 

Example 4: Using a map as the function parameter

Here is an example of using a map as the function parameter:

package main

import (
	"fmt"
	"reflect"
)

func main() {

	fmt.Println(GetStudentInfo4(map[string]interface{}{}))
	fmt.Println(GetStudentInfo4(map[string]interface{}{"Name": "Harry Potter"}))
	fmt.Println(GetStudentInfo4(map[string]interface{}{"Name": "Lady Gaga", "Age": 40}))
}

type varArgs map[string]interface{}

func GetStudentInfo4(args varArgs) string {

	name := "default-name"
	if val, ok := args["Name"]; ok {
		name = val.(string)
	}

	age := 50
	if val, ok := args["Age"]; ok {
		age = val.(int)
	}

	return fmt.Sprintf("Name: %s, Age: %d", name, age)
}

Output:

Name: default-name, Age: 50
Name: Harry Potter, Age: 50
Name: Lady Gaga, Age: 40

 

Summary

Again, Golang does not support optional parameters (can not set default values for parameters). But there will always be use cases for optional arguments, thus developers must devise their own workarounds. Hope that the examples above give you an idea of how to deploy your own solution.

 

References

https://go.dev/tour/basics/12

 

Categories GO

Can't find what you're searching for? Let us assist you.

Enter your query below, and we'll provide instant results tailored to your needs.

If my articles on GoLinuxCloud has helped you, kindly consider buying me a coffee as a token of appreciation.

Buy GoLinuxCloud a Coffee

For any other feedbacks or questions you can either use the comments section or contact me form.

Thank You for your support!!

Leave a Comment