修改值/结构的最佳实践方法

huangapple go评论144阅读模式
英文:

Best practice to modify value/struct

问题

我发现修改值/结构的方法有两种(可能还有其他方法)。

  1. 通过引用传递值
  2. 从函数/方法获取值,处理错误,然后赋值

我知道这两种方法都可以工作,但我想知道在Go语言世界中哪种方法是最佳实践。

我在这里给出了两个示例。

abc.go

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/pkg/errors"
  5. )
  6. type Request struct {
  7. AdType string
  8. }
  9. type Response struct {
  10. Message string
  11. }
  12. func main() {
  13. // 实现方法1
  14. // 通过处理函数来修改响应
  15. res1 := Response{}
  16. req1 := Request{AdType: "banner"}
  17. req1.handleResponse(&res1)
  18. // 实现方法2
  19. res2 := Response{}
  20. req2 := Request{AdType: "image"}
  21. if r, e := req2.getRequestMessage(); e == nil {
  22. res2.Message = r
  23. }
  24. fmt.Println(res1)
  25. fmt.Println(res2)
  26. }
  27. func (req *Request) handleResponse(res *Response) {
  28. if req.AdType == "banner" {
  29. res.Message = "Banner Ad"
  30. } else if req.AdType == "video" {
  31. res.Message = "Video Ad"
  32. }
  33. }
  34. func (req *Request) getRequestMessage() (string, error) {
  35. if req.AdType == "banner" {
  36. return "Banner Ad", nil
  37. } else if req.AdType == "video" {
  38. return "Video Ad", nil
  39. }
  40. return "", errors.New("Invalid ad type")
  41. }
英文:

I found that to modify a value/struct I can do it in two ways(maybe others exist).

  1. Pass value by reference
  2. 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

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/pkg/errors"
  5. )
  6. type Request struct {
  7. AdType string
  8. }
  9. type Response struct {
  10. Message string
  11. }
  12. func main() {
  13. // Implementation 1
  14. // Handle response by handle and alter response
  15. res1 := Response{}
  16. req1 := Request{AdType: "banner"}
  17. req1.handleResponse(&res1)
  18. // Implementation 2
  19. res2 := Response{}
  20. req2 := Request{AdType: "image"}
  21. if r, e := req2.getRequestMessage(); e == nil {
  22. res2.Message = r
  23. }
  24. fmt.Println(res1)
  25. fmt.Println(res2)
  26. }
  27. func (req *Request) handleResponse(res *Response) {
  28. if req.AdType == "banner" {
  29. res.Message = "Banner Ad"
  30. } else if req.AdType == "video"{
  31. res.Message = "Video Ad"
  32. }
  33. }
  34. func (req *Request) getRequestMessage() (string, error) {
  35. if req.AdType == "banner" {
  36. return "Banner Ad", nil
  37. } else if req.AdType == "video"{
  38. return "Video Ad", nil
  39. }
  40. return "", errors.New("Invalid ad type")
  41. }

答案1

得分: 1

老实说,我认为像这样的代码更符合Go的标准。它更清晰、更易于理解。

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. type Request struct {
  7. AdType string
  8. }
  9. type Response struct {
  10. Message string
  11. }
  12. func main() {
  13. res, err := handleRequest(&Request{AdType: "banner"})
  14. if err != nil {
  15. fmt.Println("获取响应时出错")
  16. }
  17. fmt.Println(res)
  18. }
  19. func handleRequest(request *Request) (*Response, error) {
  20. res := new(Response)
  21. switch request.AdType {
  22. case "banner":
  23. res.Message = "横幅广告"
  24. return res, nil
  25. case "video":
  26. res.Message = "视频广告"
  27. return res, nil
  28. }
  29. return nil, errors.New("无效的广告类型")
  30. }
英文:

Honestly, I think something like this is more of the standard in go. It's a lot cleaner and easier to follow.

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. type Request struct {
  7. AdType string
  8. }
  9. type Response struct {
  10. Message string
  11. }
  12. func main() {
  13. res, err := handleRequest(&Request{AdType: "banner"})
  14. if err != nil {
  15. fmt.Println("error getting response")
  16. }
  17. fmt.Println(res)
  18. }
  19. func handleRequest(request *Request) (*Response, error) {
  20. res := new(Response)
  21. switch request.AdType {
  22. case "banner":
  23. res.Message = "Banner Ad"
  24. return res, nil
  25. case "video":
  26. res.Message = "Video Ad"
  27. return res, nil
  28. }
  29. return nil, errors.New("invalid ad type")
  30. }

huangapple
  • 本文由 发表于 2021年11月18日 15:33:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/70016027.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定