Bài 06: Golang - Nhập Môn Cơ Bản-Function

Bài 06: Golang - Nhập Môn Cơ Bản-Function

  

Ví dụ : bây giờ chúng ta sẽ viết một chương trình so sánh hai số và xuất số lớn nhất ra màn hình:

package main
import (
    "fmt"
)
func main() {
    a := 20
    b := 10
    if a > b {
        fmt.Println(a)  
    }else{
        fmt.Println(b)
    }  
}
-    Kết quả: in ra a=20
tương tự ta có thể thay đổi giá trị a và b để xem kết quả.
Bây giờ chúng ta cần viết ra một hàm để xử lý logic xuất ra kết quả của số lớn nhất.thay vì phải coppy nhiều lần đoạn mã chúng ta sử dụng ở trên.

-    Khai báo function:

package main
import (
    "fmt"
)
func main() {
    a := 20
    b := 30
    fmt.Println(findMax(a,b))
    c := 50
    d := 80
    fmt.Println(findMax(c,d))
}
func findMax (a int, b int) int {
    if a > b {
        return  a  
    }
    return b
}
-    Thay vì phải coppy nhiều lần một đoạn mã ta viết luôn một function và chỉ việc gọi tới và sử dụng
-    Kết quả :
30
80
Nếu trong một hàm khi các biến có cùng kiểu dữ kiệu chúng ta có thể khai báo ngắn gọn như sau:
package main
import (
    "fmt"
)
func main() {
    a := 20
    b := 30
    fmt.Println(findMax(a,b))
    c := 50
    d := 80
    fmt.Println(findMax(c,d))
}
func findMax (a,b int) int {
    if a > b {
        return  a
    }
    return b
}
=> kết quả nó không thay đổi 
=> đối với các kiểu dữ liệu không phải là slide hoặc map thì khi truyền vào tham số của một hàm thì nó sẽ truyền một mảng coppy có nghĩa là nó tạo ra một vùng nhớ mới và đưa giá trị tham số này vào vúng nhớ mới đó vậy nên khi chúng ta thay đổi thao tác trên biến mà chúng ta truyền vào làm tham số cho Function.
ví dụ:
package main
import (
    "fmt"
)
func main() {
    a := 20
    b := 30
    fmt.Println(findMax(a,b))
    fmt.Println(a)
}
func findMax (a,b int) int {
    a = 1000
    if a > b {
        return a    
    }
    return b
}
Kết quả :
1000
20
-    Giải thích: khi chương trình chạy đến function fmt.Println(findMax(a,b))    thì sẻ gọi đến hàm findMax để thực thi. chạy vào hàm findMax  thì a lại được gán bằng 1000 nên hàm sẻ so sánh 1000 với b vì b nhỏ hơn nên hàm xuất ra 1000 và kết thúc hàm. sau khi kết thúc hàm nó chạy đến fmt.Println(a)  và xuất giá trị tham số ban đầu của a.  
Để giá trị  tham số ban đầu thay đổi thì ta khai báo function sử dụng con trỏ để trỏ tới địa chỉ bộ nhớ của giá trị  tham số ban đầu để thay đổi nó
package main
import (
    "fmt"
)
func main() {
    a := 20
    b := 30
    fmt.Println(findMax(&a,&b))
    fmt.Println(a)
}
func findMax (a,b *int) int {
    *a = 1000
    if *a > *b {
        return *a    
    }
    return *b
}
Kết quả :
1000
1000
Chúng ta cũng có cách khác ngắn gọn hơn:
package main
import (
    "fmt"
)
func main() {
    a := 20
    b := 30
    max := findMax(a, b)
    fmt.Println(max)  
}
func findMax (a, b int) (max int) {
    if a > b {
        max = a    
    }else{
     max = b  
    }
    return
}
Kết quả : 30

 Interface

Định nghĩa chung về interface trong thế giới Hướng đối tượng đó là ‘‘Interface xác định hành vi của một đối tượng’’. Nó chỉ xác định những gì đối tượng phải làm. Cách để thực hiện các hành vi này tùy thuộc vào đối tượng đó.

Trong Go, một interface là tập hợp các khai báo phương thức. Khi một kiểu dữ liệu định nghĩa tất cả các phương thức trong một interface, thì nó được gọi là implement interface đó (triển khai interface). Điều này tương tự như trong thế giới OOP. Interface xác định một kiểu dữ liệu nên có những phương thức nào và cách nó implement những phương thức đó.

-    khai báo  Interface:

package main
import (
    "fmt"
)
func main() {
    var w Writer = ConsoleWriter{}
    w.Write([]byte("hello world"))
}
type Writer interface{
    Write([]byte) (int, error)
}
type ConsoleWriter struct {}
func (cw ConsoleWriter) Write(data []byte) (int, error){
    n,err := fmt.Println(string(data))
    return n,err
}
Kết quả : hello world

Đăng nhận xét

0 Nhận xét

myadcash