Struct và interface

Go Generics

Write one function or type that works with many types using type parameters.

  • Trung cấp
  • Đọc trong 5 phút
  • 1 ví dụ chạy được
Bạn sẽ học được gì
  • Type parameters
  • Constraints
  • Generic types
Sum[T Number]
Sum([]int{1, 2, 3})6
Sum([]float64{1.5, 2.5})4

One definition, many types

Generics let you write code once and use it with different types. A type parameter such as T, written in square brackets, stands for a type that is chosen where the code is used.

Number is a constraint: Sum accepts any type built on int or float64. Map has two type parameters, so it can turn a slice of one type into a slice of another. Stack[T] is a generic type, and Stack[string] is a stack of strings.

Những điểm quan trọng

  1. [T Number] limits T to numbers.
  2. any allows every type.
  3. Stack[string] is a stack of strings.

Ví dụ Go chạy được

Go
Chạy code →
main.go
package main

import (
	"fmt"
	"strings"
)

type Number interface {
	~int | ~float64
}

func Sum[T Number](values []T) T {
	var total T
	for _, value := range values {
		total += value
	}
	return total
}

func Map[T, U any](items []T, convert func(T) U) []U {
	result := make([]U, 0, len(items))
	for _, item := range items {
		result = append(result, convert(item))
	}
	return result
}

type Stack[T any] struct {
	items []T
}

func (s *Stack[T]) Push(item T) { s.items = append(s.items, item) }

func (s *Stack[T]) Pop() (T, bool) {
	var zero T
	if len(s.items) == 0 {
		return zero, false
	}
	last := s.items[len(s.items)-1]
	s.items = s.items[:len(s.items)-1]
	return last, true
}

func main() {
	fmt.Println(Sum([]int{1, 2, 3}), Sum([]float64{1.5, 2.5}))
	fmt.Println(Map([]int{1, 2, 3}, func(n int) string { return strings.Repeat("*", n) }))

	stack := &Stack[string]{}
	stack.Push("a")
	stack.Push("b")
	top, _ := stack.Pop()
	fmt.Println(top, len(stack.items))
}
Lấy nút Run cho ví dụ này Kết quả khi chạy
6 4
[* ** ***]
b 1

Luyện tập

Mở ví dụ trong trình biên dịch online, đổi một giá trị hoặc thêm một dòng, rồi đoán kết quả trước khi chạy. Sau đó cố ý làm code bị lỗi và đọc thông báo của trình biên dịch.

Bạn học xong bài này chưa?

Đánh dấu đã học để theo dõi tiến độ của bạn.

Luyện tập với thử thách

Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.

Tất cả thử thách