Học Go cấp tốc Phần 5: Methods và Interfaces
TIL
542
Go
47
golang
45
White

Robin Huy viết ngày 14/04/2018

Các phần trước:

Phần 1: Packages, variables và functions.

Phần 2: Điều khiển luồng với if, else, switch và defer.

Phần 3: Arrays và Slices.

Phần 4: Structs và Maps.

alt text

Methods

Trong Go không có class, chúng ta có thể dùng struct thay cho class như ở phần trước. Tuy nhiên trong struct mới chỉ có thuộc tính chứ chưa có phương thức. Để ứng dụng được phương thức (method) như các ngôn ngữ hướng đối tượng khác ta sẽ cần khai báo function kèm theo một tham số đặc biệt gọi là receiver argument. Receiver argument nằm ở giữa từ khóa functên của function, nó sẽ chỉ ra một type (thường là một struct) để áp dụng hàm này làm phương thức. Ví dụ:

package main

import (
    "fmt"
    "math"
)

// Định nghĩa struct Vertex với 2 thuộc tính X và Y
type Vertex struct {
    X, Y float64
}

// Tạo phương thức Abs() cho struct Vertex (receiver argument)
func (v Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
    // Khởi tạo struct
    v := Vertex{3, 4}

    // Gọi phương thức Abs() của struct
    fmt.Println(v.Abs())
}

Interfaces

Interface là một định nghĩa các tập hợp phương thức mà một đối tượng cần tuân thủ (tương tự như ở trong các ngôn ngữ hướng đối tượng khác). Khi một type có chứa các phương thức như đã khai báo trong interface thì nó đang triển khai (implement) interface đó. Ví dụ:

package main

import "fmt"

// Định nghĩa interface I với 1 method là M()
type I interface {
    M()
}

// Định nghĩa struct T với 1 field là S kiểu string
type T struct {
    S string
}

// Định nghĩa phương thức M() cho struct T
// Struct T sẽ tự động implement interface I
func (t T) M() {
    fmt.Println(t.S)
}

func main() {
    // Khởi tạo biến i có kiểu là interface I
    var i I = T{"hello"}

    // Gọi phương thức M()
    i.M()
}

Type đã triển khai interface buộc phải có đầy đủ các method được định nghĩa trong interface. Ví dụ:

package main

import "fmt"

// Định nghĩa interface I với 1 method là M() và N()
type I interface {
    M(),
    N()
}

// Định nghĩa struct T
type T struct {
    S string
}

// Định nghĩa phương thức M() cho struct T
// Struct T sẽ tự động implement interface I
func (t T) M() {
    fmt.Println(t.S)
}

func main() {
    // Khởi tạo biến i có kiểu là interface I
    var i I = T{"hello"}

    // Gọi phương thức M()
    i.M()

    // Kết quả sẽ báo lỗi vì struct T implement interface I,
    // nhưng không có đủ các method đã khai báo (thiếu method N())
}

Một interface mà không có chứa method nào thì gọi là interface rỗng (Emtpy Interface). Interface rỗng có thể lưu mọi loại dữ liệu nên thường được dùng trong trường hợp các hàm xử lý mà cần tham số động (không biết trước kiểu dữ liệu). Ví dụ:

package main

import "fmt"

func main() {
    var i interface{}   // i là một empty interface

    // Họi hàm describe với tham số truyền vào là một số
    i = 42
    describe(i)

    // Họi hàm describe với tham số truyền vào là một chuỗi
    i = "hello"
    describe(i)
}

// Hàm describe có tham số truyền vào là một empty interface
// do đó khi thực thi ta có thể truyền vào kiểu dữ liệu nào cũng được
func describe(i interface{}) {
    fmt.Printf("(%v, %T)\n", i, i)
}
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Robin Huy

7 bài viết.
5 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
7 6
Bài viết được copy lại từ (Link) (hơi cũ nhưng vẫn xài tốt :smile:) (Ảnh) Hiện nay hầu hết các trang web đều đã hỗ trợ SSL (Secure Socket Layer)....
Robin Huy viết 9 ngày trước
7 6
White
4 1
Go (hay thường được gọi là Golang) là một ngôn ngữ lập trình mã nguồn mở được tạo ở Google vào năm 2009 bởi Robert Griesemer, Rob Pike, và Ken Thom...
Robin Huy viết 1 tháng trước
4 1
White
3 2
Phần trước: (Link). (Ảnh) Phần tiếp theo chúng ta sẽ cùng tìm hiểu cách (Link) trong Go. Vòng lặp Trong Go chỉ có 1 kiểu vòng lặp là sử dụng f...
Robin Huy viết 30 ngày trước
3 2
Bài viết liên quan
White
19 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết hơn 1 năm trước
19 1
White
1 1
Chào mọi người, hôm nay mình viết một bài TIL nhỏ về cách lấy độ phân giải của màn hình hiện tại đang sử dụng. xdpyinfo | grep dimensions Kết quả...
namtx viết 9 tháng trước
1 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
7 bài viết.
5 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!