Golang 如何为结构体字段分配默认值

可以通过使用构造函数为结构体分配默认值。我们可以使用构造函数为所有或部分成员分配自定义默认值,而不是直接创建结构体。

示例1:

// Golang程序用于为
//使用构造函数将默认值分配给结构体
package main
 
import (
    "fmt"
)
 
// 声明一个student结构体
type Student struct{
     
    // 声明结构体变量
    name string
    marks int64
    age int64
}
 
// 构造函数
func(std *Student) fill_defaults(){
     
    //设置默认值
    // 如果没有值存在
    if std.name == "" {
        std.name = "ABC"
    }
     
    if std.marks == 0 {
        std.marks = 40
    }
     
    if std.age == 0 {
        std.age = 18
    }
}
 
// 主函数
func main() {
     
    // 创建一个仅初始化姓名的结构
    std1 := Student{name: "Vani"}
     
    // 打印结构
    // 不带默认值
    fmt.Println(std1)
     
    // 这将分配默认值
    // 在结构std1中未初始化的值
    std1.fill_defaults()
     
    // 分配后打印
    // 默认值到结构变量
    fmt.Println(std1)
     
    // 创建一个初始化年龄和分数的结构
    std2 := Student{age: 19, marks: 78}
     
    // 分配默认名称
    std2.fill_defaults()
     
    // 分配后打印
    // 结果名称到结构中
    fmt.Println(std2)
     
} 

输出:

{Vani 0 0}
{Vani 40 18}
{ABC 78 19}

另一种为结构体分配默认值的方法是使用标签。标签只能用于字符串值,可以使用单引号(“)实现。

示例2:

// Golang程序用于为
//使用标签为结构体分配默认值
 
package main
 
import (
    "fmt"
    "reflect"
)
 
// 声明一个person结构
type Person struct {
     
    // 将名称的默认值设置为“geek”
      name string `default:"geek"` 
     
}
 
func default_tag(p Person) string {
     
    // TypeOf返回传递给它的接口值的类型
      typ := reflect.TypeOf(p)
     
    // 检查字符串是否为空
      if p.name == "" {
         
        // 返回具有给定参数“name”的结构字段
        f, _ := typ.FieldByName("name")
         
        // 在标签字符串中返回与键关联的值
        // 如果标签中没有这样的键,则返回空字符串
        p.name = f.Tag.Get("default")
      }
     
      return fmt.Sprintf("%s", p.name)
}
 
// 主函数
func main(){
     
    // 打印默认名称
    fmt.Println("默认名称为:", default_tag(Person{}))
} 

输出:

默认名称为: geek