pointer trong golang

trước khi tìm hiểu con trỏ (pointer) trong golang chúng ta cùng tìm hiểu qua về tham chiếu (pass by reference) và tham trị (pass by value)

đặt vấn đề:

ae code trên các language khác như php, java, c# đều có có khái niệm này, chỉ là chúng hỗ trợ trên các hình thức khác nhau mà thôi (cũng thể hiện được là ngôn ngữ có mạnh mẽ hay không)

ví dụ trong javascript: tuy không hỗ trợ mạnh pointer, hoặc chủ động tham chiếu tham trị nhưng nó cũng có cách hoạt động riêng của nó

riêng thế nào? tự tìm hiểu nhé =))

ae code js chắc cũng đau đầu với 2 ô này shallow copy và deep copy, vậy có khi nào ae đặt vài câu hỏi sau:

+ tại sao các kiểu dữ liệu nguyên thủy như: string, number, boolean, enum thì k cần shallow copy
+ tại sao các kiểu dữ liệu như: array, object thì có shallow copy và khó khăn trong deep copy

nó là cái gì?

Tham trị nghĩa là khi một biến được truyền vào một hàm, một bản sao của giá trị của biến đó được tạo ra và sử dụng trong hàm. Điều này có nghĩa là bất kỳ thay đổi nào đối với biến trong hàm sẽ không ảnh hưởng đến biến ban đầu.

Tham chiếu nghĩa là khi một biến được truyền vào một hàm, thay vì tạo ra một bản sao của giá trị của biến, một tham chiếu đến biến gốc được tạo ra. Điều này có nghĩa là bất kỳ thay đổi nào đối với biến trong hàm sẽ ảnh hưởng đến biến ban đầu.

để làm gì?

Hãy tưởng tượng bạn sống trong một tòa nhà lớn, mỗi căn hộ trong đó đại diện cho một giá trị dữ liệu khác nhau trong bộ nhớ máy tính của bạn. Mỗi căn hộ có một số hộp thư duy nhất, tương ứng với địa chỉ bộ nhớ của dữ liệu đó. Dưới đây là cách chúng ta có thể liên tưởng:

  • Tòa nhà (Bộ nhớ): Toàn bộ không gian bộ nhớ có sẵn trong máy tính của bạn.
  • Căn hộ (Dữ liệu): Một vị trí cụ thể trong bộ nhớ chứa một giá trị hoặc đối tượng.
  • Hộp thư (reference): Một địa chỉ cho biết căn hộ (dữ liệu) nằm ở đâu.

Tất cả các hộp thư đều có cùng kích thước, bất kể kích thước của căn hộ mà chúng đề cập đến. Gửi số hộp thư (reference) sẽ dễ dàng và hiệu quả hơn nhiều so với gửi toàn bộ căn hộ (value)

Hãy tưởng tượng bạn có một biến chứa 4 GB dữ liệu và bạn cần truyền biến này vào một hàm khác. Nếu không có reference, toàn bộ biến sẽ được sao chép sang phạm vi của hàm sử dụng nó. Điều này có nghĩa là bạn sẽ có tổng cộng 8 GB bộ nhớ bị chiếm dụng bởi biến này, và con số đó có thể tăng lên nếu hàm thứ hai lại tiếp tục sử dụng biến đó trong một hàm khác

hiểu đơn giản thế này thay vì truyền cả 1 cục object, array 4GB qua các hàm, thì ta chỉ cần truyền địa chỉ ô nhớ (rất nhẹ) chứa biến này
trong các hàm nhận data này cần sử dụng thì gọi điến value của địa chỉ ô nhớ

đọc đến đây mấy ae javascript trả lời được 2 câu hỏi bên trên rồi đúng k? =)), mình sẽ k giải thích thêm để ae tìm hiểu sẽ nhớ vào đầu hơn

câu hỏi tiếp theo là khi nào nên dùng

1. Truyền Dữ Liệu Lớn Cho Hàm

2. Thay Đổi Giá Trị Bên Trong Hàm

3. Làm Việc Với Cấu Trúc Liên Kết Động

4. Cải Thiện Hiệu Suất

golang base trên nền C, C++ nên hỗ trợ con trỏ mạnh

Trong Go, con trỏ là một tính năng quan trọng giúp bạn quản lý bộ nhớ hiệu quả và truyền tham chiếu thay vì giá trị. Điều này đặc biệt hữu ích khi làm việc với các cấu trúc dữ liệu lớn hoặc khi bạn muốn các hàm có thể thay đổi giá trị của các biến bên ngoài phạm vi của chúng.

Cú pháp và cách sử dụng con trỏ

  1. Khai báo và khởi tạo con trỏĐể khai báo một con trỏ, bạn sử dụng ký tự * trước kiểu dữ liệu. Để lấy địa chỉ của một biến, bạn sử dụng ký tự &.

var x int = 10

var p *int = &x

Khi truyền một con trỏ vào hàm, bạn có thể thay đổi giá trị của biến mà con trỏ trỏ đến.

func increment(p *int) { *p = *p + 1 }

func main() { var x int = 10 increment(&x) fmt.Println(“Giá trị của x sau khi gọi hàm increment:”, x) }

hẹn ae trong các bài viết tiếp theo

Related Posts