英文:
Best practice to modify value/struct
问题
我发现修改值/结构的方法有两种(可能还有其他方法)。
- 通过引用传递值
- 从函数/方法获取值,处理错误,然后赋值
我知道这两种方法都可以工作,但我想知道在Go语言世界中哪种方法是最佳实践。
我在这里给出了两个示例。
abc.go
package main
import (
"fmt"
"github.com/pkg/errors"
)
type Request struct {
AdType string
}
type Response struct {
Message string
}
func main() {
// 实现方法1
// 通过处理函数来修改响应
res1 := Response{}
req1 := Request{AdType: "banner"}
req1.handleResponse(&res1)
// 实现方法2
res2 := Response{}
req2 := Request{AdType: "image"}
if r, e := req2.getRequestMessage(); e == nil {
res2.Message = r
}
fmt.Println(res1)
fmt.Println(res2)
}
func (req *Request) handleResponse(res *Response) {
if req.AdType == "banner" {
res.Message = "Banner Ad"
} else if req.AdType == "video" {
res.Message = "Video Ad"
}
}
func (req *Request) getRequestMessage() (string, error) {
if req.AdType == "banner" {
return "Banner Ad", nil
} else if req.AdType == "video" {
return "Video Ad", nil
}
return "", errors.New("Invalid ad type")
}
英文:
I found that to modify a value/struct I can do it in two ways(maybe others exist).
- Pass value by reference
- Get value from function/method, handle error then assign
I know both methods work but I am wondering which method is best practice in the golang world.
I am giving both examples here.
abc.go
package main
import (
"fmt"
"github.com/pkg/errors"
)
type Request struct {
AdType string
}
type Response struct {
Message string
}
func main() {
// Implementation 1
// Handle response by handle and alter response
res1 := Response{}
req1 := Request{AdType: "banner"}
req1.handleResponse(&res1)
// Implementation 2
res2 := Response{}
req2 := Request{AdType: "image"}
if r, e := req2.getRequestMessage(); e == nil {
res2.Message = r
}
fmt.Println(res1)
fmt.Println(res2)
}
func (req *Request) handleResponse(res *Response) {
if req.AdType == "banner" {
res.Message = "Banner Ad"
} else if req.AdType == "video"{
res.Message = "Video Ad"
}
}
func (req *Request) getRequestMessage() (string, error) {
if req.AdType == "banner" {
return "Banner Ad", nil
} else if req.AdType == "video"{
return "Video Ad", nil
}
return "", errors.New("Invalid ad type")
}
答案1
得分: 1
老实说,我认为像这样的代码更符合Go的标准。它更清晰、更易于理解。
package main
import (
"errors"
"fmt"
)
type Request struct {
AdType string
}
type Response struct {
Message string
}
func main() {
res, err := handleRequest(&Request{AdType: "banner"})
if err != nil {
fmt.Println("获取响应时出错")
}
fmt.Println(res)
}
func handleRequest(request *Request) (*Response, error) {
res := new(Response)
switch request.AdType {
case "banner":
res.Message = "横幅广告"
return res, nil
case "video":
res.Message = "视频广告"
return res, nil
}
return nil, errors.New("无效的广告类型")
}
英文:
Honestly, I think something like this is more of the standard in go. It's a lot cleaner and easier to follow.
package main
import (
"errors"
"fmt"
)
type Request struct {
AdType string
}
type Response struct {
Message string
}
func main() {
res, err := handleRequest(&Request{AdType: "banner"})
if err != nil {
fmt.Println("error getting response")
}
fmt.Println(res)
}
func handleRequest(request *Request) (*Response, error) {
res := new(Response)
switch request.AdType {
case "banner":
res.Message = "Banner Ad"
return res, nil
case "video":
res.Message = "Video Ad"
return res, nil
}
return nil, errors.New("invalid ad type")
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论