Mẹo nhỏ: Swap 2 biến nhanh chóng trong Golang


  • Trùm cuối

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	a, b := 6, 9
    	fmt.Println(a, b)
    	a, b = b, a
    	fmt.Println(a, b)
    }
    

    Test ngay cho nóng: https://play.golang.org/p/ELyepI--mKf 😁



  • Thực sự mà nói thì Go bị ảnh hưởng rất nhiều bởi Lua (nhưng thằng wiki không list Lua vào phần inspired 😂) Từ tích hợp GC, phong cách code không chấm phẩy ";", syntax (có điều compiler check kinh quá, nên syntax hơi cứng hơn) cho đến cách assign value như này 🙂

    ab sẽ được push lên stack, sau đó các giá trị lần lượt pop xuống để gán vào biến. Quá trình sẽ thực hiện từ trái sang phải.

    Ta có thể check:

    func p(x int) int {
        fmt.Printf("%d\n", x)
        return x
    }
    
    func main() {
        a, b := 5, 10
        a, b = p(b), p(a)
        fmt.Printf("a: %d, b: %d\n",a , b)
    }
    
    $ go run main.go
    10
    5
    a: 10, b: 5
    

    Cách này sẽ rất nhanh chóng cho bài toán fibonnaci (trong trường hợp không dùng hàm đệ quy). Nếu là C/C++ hay các ngôn ngữ không hỗ trợ phép gán như này thì phải dùng đến biến thứ 3 (chẳng hạn c) làm trung gian.

    func fib(n int) int {
        a, b := 1, 1
        for i := 1; i < n; i++ {
            a, b = b, a + b
        }
        return a
    }
    
    func main() {
        fmt.Printlnf("fib: %d\n", fib(10))
    }
    
    $ go run main.go
    55
    

  • Trùm cuối

    @wuuyi thanks bác đã bổ sung nguyên lý của multiple assignment rất chi tiết và dễ hiểu 💪 😁 👍



Có thể bạn cũng quan tâm

  • 5
  • 4
  • 3
.
DMCA.com Protection Status