fill

package module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 29, 2022 License: MIT Imports: 6 Imported by: 2

README

go-fill

LICENSE codecov GitHub Stars

1.背景

记得第一次接触Go,当时在处理一段结构体解析上耗费了大量的精力。我对此感到很困惑,因为这在Python中应该是很简单的一件事情。
特别是json.Marshal时,当结构体中存在大量空值时,json结果集中往往会出现大量nil,给前端同事带来不小的麻烦。

go-fill 实现对结构体空值的填充,填充来源包括 零值、默认值、环境变量 等属性。

2.目标

1、填充环境变量

  • Env Value

2、填充默认值

  • Default Value

3、填充零值

  • Zero Value

3.标签说明

tag comment
fill:"fieldName" 字段名,若未指定,则默认是原字段大写。
fill:",default=value" 当字段最终判定为零值时,设定的默认值。
fill:",require" 当字段最终判定为零值时,返回错误。require 在 default 之后生效。
fill:",empty" 设置当前字段名为空字符串。一般用于嵌套结构体中想跳过某些属性。
fill:",sep=_" 嵌套结构体时,设定连接符,默认是下划线 "_"。

4.使用

1、填充环境变量

// 依赖
import "github.com/czasg/go-fill"
// 准备结构体
type Config struct {
	Host     string `fill:"HOST,default=localhost"`
	Port     int    `fill:"PORT,default=5432"`
	User     string `fill:"USER,default=root"`
	Password string `fill:"PASSWORD,default=root"`
}
// 初始化
cfg := Config{}
// 填充环境变量
_ = fill.FillEnv(&cfg)
_ = fill.Fill(&cfg, fill.OptEnv)

5.Demo

package main

import (
	"fmt"
	"github.com/czasg/go-fill"
	"os"
)

type Config struct {
	Postgres `env:"PG"`
	Redis    `env:"RDS"`
}

type Redis struct {
	Addr     string
	Password string
	DB       int
}

type Postgres struct {
	Addr     string
	User     string
	Password string
	Database string
}

func main() {
	_ = os.Setenv("PG_ADDR", "PG_ADDR")
	_ = os.Setenv("PG_USER", "PG_USER")
	_ = os.Setenv("PG_PASSWORD", "PG_PASSWORD")
	_ = os.Setenv("PG_DATABASE", "PG_DATABASE")
	_ = os.Setenv("RDS_ADDR", "RDS_ADDR")
	_ = os.Setenv("RDS_PASSWORD", "RDS_PASSWORD")
	_ = os.Setenv("RDS_DB", "RDS_DB")
	cfg := Config{}
	_ = fill.FillEnv(&cfg)
	fmt.Println(cfg)
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	NotPointerStructErr = errors.New("only the pointer to a struct is supported")
)

Functions

func Fill

func Fill(v interface{}, opts ...Opt) error

func FillEnv

func FillEnv(v interface{}) error

Types

type Opt

type Opt int
const (
	OptEnv    Opt = 1 << iota
	OptSilent     // ignore err and iterate over all fields.
)

type Payload

type Payload struct {
	Value       reflect.Value
	Prefix      string
	Opt         Opt
	Field       reflect.Value
	StructField reflect.StructField
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL
JackTT - Gopher 🇻🇳