Golang结构之间的简单类型转换

455 阅读1分钟

转换器

Golang 结构之间的简单类型转换器。

这个包试图匹配一个结构上的属性名称和类型来进行转换。

使用方法

假设你有一个DTO需要转换为一个Model:

package main


import (
	"fmt"

	"github.com/VictorRibeiroLima/converter"
)

type User struct {
	ID       uint
	UserName string
	Password string
	IsAdmin  bool
}

type CreateUserDto struct {
	UserName string
	Password string
}

如果DTO和Model不完全匹配,你就无法进行转换:

func main() {
	var user User
	dto := CreateUserDto{
		UserName: "LukeSlywalker",
		Password: "benKenoby1977",
	}

	user = (User)(dto)//cannot convert dto (variable of type CreateUserDto) to User
	fmt.Println(user)
}

这就是为什么制作了这个包,以实现这些简单的转换:

func main() {
	var user User
	dto := CreateUserDto{
		UserName: "LukeSlywalker",
		Password: "benKenoby1977",
	}

	converter.Convert(&user, dto)

	fmt.Println(user) //{0 LukeSlywalker benKenoby1977 false}

  /*
    User{
      ID: 0,
      UserName: "LukeSlywalker",
      Password: "benKenoby1977",
      IsAdmin: false
    }
  */
}

高级用法

让我们更深入地了解一下这些使用情况。

如果你有一个嵌套结构在你的模型和DTO里面,让我们把一些指针也扔在里面(GORM用它来做数据库的NOT NULL字段)怎么办?

package main

import (
	"fmt"

	"github.com/VictorRibeiroLima/converter"
)

type Address struct {
	ID      uint
	Country string
	City    string
	Street  string
}

type User struct {
	ID       uint
	UserName *string
	Password *string
	IsAdmin  bool
	Address  Address
}

type AddressDto struct {
	Country string
	City    string
	Street  string
}

type CreateUserDto struct {
	UserName string
	Password string
	Address  AddressDto
}

func main() {
	var user User
	address := AddressDto{
		Country: "Jundland Wastes",
		City:    "Great Chott salt flat",
		Street:  "Lars homestead",
	}
	dto := CreateUserDto{
		UserName: "LukeSlywalker",
		Password: "benKenoby1977",
		Address:  address,
	}

	converter.Convert(&user, dto)

	fmt.Println(user)

  /*
    User{
      ID: 0,
      UserName: 0xc000010250,
      Password: 0xc000010260,
      IsAdmin: false,
      Address: {
        ID 0,
        Country: "Jundland Wastes",
	City:    "Great Chott salt flat",
	Street:  "Lars homestead",
      }
    }
  */
}
- (user.UserName user.Password) will not be pointers to (dto.UserName dto.Password)

你也可以这样做:

  • 数组到数组
  • 片断到片断
  • 指针到值
  • 值到指针
  • 指针到指针
  • 结构片到另一结构片的转换
  • 结构的指针的片断到另一个结构的值的片断

你会明白的