Implement struct no copy in GoLang

  sonic0002        2020-09-04 22:24:58       20,566        0          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

Có một số trường hợp mà một số cấu trúc trong GoLang không được sao chép. Ví dụ, đôi khi một cấu hình toàn cục chỉ nên có một phiên bản duy nhất được truyền qua toàn bộ ứng dụng và không nên được sao chép và sửa đổi.

Trong GoLang, không có giải pháp trực quan nào để ngăn chặn việc sao chép cấu trúc. Nhưng vẫn có một số cách có thể được tận dụng để giúp ngăn chặn điều này trong khi phát triển mã. Mẹo là định nghĩa một số cấu trúc thực hiện giao diện sync.Locker và có cấu trúc này được nhúng trong bất kỳ cấu trúc nào không được phép sao chép.

// noCopy có thể được nhúng vào các cấu trúc không được sao chép
// sau lần sử dụng đầu tiên.
//
// Xem https://golang.org/issues/8005#issuecomment-190753527
// để biết chi tiết.
type noCopy struct{}

// Lock là một no-op được sử dụng bởi trình kiểm tra -copylocks từ `go vet`.
func (*noCopy) Lock() {}
func (*noCopy) UnLock() {}

Dưới đây là một đoạn mã ví dụ giải thích ở trên.

package main

import (
	"fmt"
)

type noCopy struct{}

func (*noCopy) Lock()   {}
func (*noCopy) Unlock() {}

type Demo struct {
	noCopy noCopy
}

func Copy(d Demo) {
}

func main() {
	d := Demo{}
	fmt.Printf("%+v", d)

	Copy(d)

	fmt.Printf("%+v", d)
}

Bây giờ nếu bạn chạy go vet trên tệp main.go, bạn sẽ thấy một số lỗi cho biết bạn đang có một số nơi sao chép cấu trúc (Copy()).

> go vet main.go
# command-line-arguments
.\main.go:16: Copy truyền khóa theo giá trị: main.Demo chứa main.noCopy
.\main.go:21: gọi fmt.Printf sao chép giá trị khóa: main.Demo chứa main.noCopy
.\main.go:23: gọi Copy sao chép giá trị khóa: main.Demo chứa main.noCopy
.\main.go:25: gọi fmt.Printf sao chép giá trị khóa: main.Demo chứa main.noCopy

Một điều cần lưu ý ở đây là cách tiếp cận trên sẽ không yêu cầu trình biên dịch làm hỏng quá trình biên dịch. Nếu bạn tiến hành biên dịch và chạy nó, nó vẫn sẽ hoạt động. Điều này chỉ cung cấp một gợi ý khác cho go vet mà thông thường chúng ta sẽ chạy trước khi xây dựng dự án để kiểm tra xem có thể có vấn đề tiềm ẩn trong mã nguồn của chúng ta hay không.

> go run main.go
{noCopy:{}}{noCopy:{}}

Tham khảo:

GO VET  NOCOPY  NO COPY 

       

  RELATED


  0 COMMENT


No comment for this article.



  RANDOM FUN

Sit back and relax