x/tools/gopls: 提供结构A到结构B的自动转换

eoigrqb6  于 6个月前  发布在  Go
关注(0)|答案(4)|浏览(47)

gopls版本

构建信息 ----------- golang.org/x/tools/gopls v0.15.0-pre.1 golang.org/x/tools/gopls@v0.15.0-pre.1 h1:u87rDKpsE6ax0cASyD9mJW9If25TtW0IupV6vKDDevg= github.com/BurntSushi/toml@v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/google/go-cmp@v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= golang.org/x/exp/typeparams@v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW 6Y= golang.org/x/mod@v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/sync@v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/telemetry@v0.0.0-20231114163143-69313e640400 h1:brbkEFfGwNGAEkykUOcryE/JiHUMMJouzE0fWWmz/QU= golang.org/x/text@v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/tools@v0.16.2-0.20240105173808-36a523fefd90 h1:3dw2Y1Aes2o83VYvSZSPc+p70AuT9zvNCTBHCvUUZrE= golang.org/x/vuln@v1.0.1 h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU= honnef.co/go/tools@v0.4.5 h1:YGD4H+SuIOOqsyoLOpZDWcieM28W47/zRO7f+9V3nvo= mvdan.cc/gofumpt@v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM= mvdan.cc/xurls/v2@v2.4.0 h1:tzxjVAj+wSBmDcF6zBB7/myTy3gX9xvi8Tyr28AuQgc= go: go1.21.5

go env

GO111MODULE=''
GOARCH='arm64'
GOBIN=''
GOCACHE='/Users/toad/Library/Caches/go-build'
GOENV='/Users/toad/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/toad/work/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='darwin'
GOPATH='/Users/toad/work'
GOPRIVATE=''
GOPROXY='https://goproxy.cn,direct'
GOROOT='/Users/toad/go/go1.21.5'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/Users/toad/go/go1.21.5/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.21.5'
GCCGO='gccgo'
AR='ar'
CC='cc'
CXX='clang++'
CGO_ENABLED='1'
GOMOD='/Users/toad/work/demo1/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-pref
ix-map=/var/folders/g1/tgmnlrdn3vxgv08kdgh9vpkw0000gn/T/go-build2737097617=/tmp/go-build -gno-record-gcc-switch
es -fno-common'

你做了什么?

a=b 中调用代码操作

type AA struct {
	CCC string
	EEE string
	BBB int
}

type BB struct {
	CCC string
	BBB int 
	DDD string
}

func main() {
	var (
		a AA
		b BB
	)

	a=b
}

你看到了什么?

没有代码操作。

你期望看到什么?

有支持自动转换的代码操作。

func main() {
	var (
		a AA
		b BB
	)

	a = AA{
		CCC: b.CCC,
		BBB: b.BBB,
	}
}

编辑器和设置

  • 无响应*

日志

  • 无响应*
5kgi1eie

5kgi1eie1#

@gopherbot, please add label FeatureRequest

niwlg2el

niwlg2el2#

请描述您希望此功能如何精确工作的详细方式?如果b中的任何字段名称与a中的字段匹配,是否应生成一个复合字面量Map这些字段?如果B中存在具有匹配名称和类型的方法,我们是否应该调用它们?
我认为这样的功能很少需要。您是否发现您经常使用这个功能?

dphi5xsq

dphi5xsq3#

@findleyr
我觉得这样的功能很少需要。你发现你会经常使用这个功能吗?
是的,我经常使用这个功能。
在我们的服务中,不同层之间使用不同的结构体。
例如:

// Request struct
type AddUser struct {
        Name  string
	Addr  string
	RequestID string // or other field.
}

// User Table struct
// This structure maps one-to-one to the database table fields.
type UserTable struct {
      Name string
      Addr  string
}

如果在b中有任何字段名与a中的字段名匹配,生成一个复合字面量Map这些字段?
是的。
处理复合数据结构会很好。
像B.UserID -> A.User.ID

type AA struct {
	User
}

type User struct{
         ID string
}

type BB struct {
	UserID string
}

a = AA{
	User: User{
		ID: b.UserID,
	},
}

如果B中有与A中同名且类型相同的方法,我们应该调用它们吗?
是的。
它应该支持以Get开头的方法。我经常需要将protobuf中的结构转换为我自己的结构。

nhhxz33t

nhhxz33t4#

关于这个,有什么新消息吗?
如果你同意的话,我很乐意提供该功能的实现。

相关问题