Как назначить значение по умолчанию для поля структуры в Golang?

Опубликовано: 31 Января, 2022

Значения по умолчанию могут быть присвоены структуре с помощью функции конструктора. Вместо того, чтобы создавать структуру напрямую, мы можем использовать конструктор для присвоения пользовательских значений по умолчанию всем или некоторым ее членам.

Example 1:

// Golang program to assign
// default values to a struct 
// using constructor function
package main
  
import (
    "fmt"
)
  
// declaring a student struct
type Student struct{
      
    // declaring struct variables
    name string
    marks int64
    age int64
}
  
// constructor function
func(std *Student) fill_defaults(){
  
    // setting default values
    // if no values present
    if std.name == "" {
        std.name = "ABC"
    }
      
    if std.marks == 0 {
        std.marks = 40
    }
      
    if std.age == 0 {
        std.age = 18
    }
}
  
// main function
func main() {
  
    // creating a struct where
    // only the name is initialised
    std1 := Student{name: "Vani"}
      
    // printing the struct 
    // with no default values
    fmt.Println(std1)
      
    // this will assign default values 
    // to non-initialised valiables
    // in struct std1
    std1.fill_defaults()
      
    // printing after assigning
    // defaults to struct variables
    fmt.Println(std1)
      
    // creating a struct where
    // age and marks are initialised
    std2 := Student{age: 19, marks: 78}
      
    // assigning default name
    std2.fill_defaults()
      
    // printing after assigning 
    // default name to struct
    fmt.Println(std2)
      
}

Выход:

{Вани 0 0}
{Vani 40 18}
{ABC 78 19}

Другой способ присвоения структурным значениям по умолчанию - использование тегов. Теги могут использоваться только для строковых значений и могут быть реализованы с помощью одинарных кавычек (”).

Example 2:

// Golang program to assign
// default values to a struct 
// using tags
  
package main
  
import (
    "fmt"
    "reflect"
)
  
// declaring a person struct
type Person struct {
  
    // setting the default value 
    // of name to "geek"
      name string `default:"geek"
  
}
  
func default_tag(p Person) string {
  
    // TypeOf returns type of 
    // interface value passed to it
      typ := reflect.TypeOf(p)
  
    // checking if null string
      if p.name == "" {
          
        // returns the struct field 
        // with the given parameter "name"
            f, _ := typ.FieldByName("name")
          
        // returns the value associated 
        // with key in the tag string
        // and returns empty string if 
        // no such key in tag
            p.name = f.Tag.Get("default")
      }
  
      return fmt.Sprintf("%s", p.name)
}
  
// main function
func main(){
  
    // prints out the default name 
    fmt.Println("Default name is:", default_tag(Person{}))
}

Выход:

Имя по умолчанию: компьютерщик