Skip to content

Commit

Permalink
Add Go generics
Browse files Browse the repository at this point in the history
  • Loading branch information
lihuanshuai committed Jun 30, 2024
1 parent 817406c commit f3a6dc0
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 6 deletions.
2 changes: 0 additions & 2 deletions content/posts/git-objects-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ draft = false
mermaid = true
+++

# Git 内部对象模型

Git 是一个分布式版本控制系统,它的核心是一个简单的键值对数据库,这个数据库存储了所有的文件和目录的内容,以及它们的元数据。这些数据被称为 Git 对象,它们是 Git 的基本构建块。

## Git 对象
Expand Down
90 changes: 90 additions & 0 deletions content/posts/go-generics.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
+++
title = 'Go 泛型'
date = 2024-07-01T00:51:01+08:00
tags = ['Go', 'Generics']
draft = false
+++

Go 1.18 版本引入了泛型,这是 Go 语言的一个重大更新。泛型是一种编程范式,它允许我们编写更加通用和灵活的代码。

Go 通过类型参数来实现泛型。类型参数是一种特殊的参数,它可以接受任意类型的值。我们可以在函数、结构体、接口等地方使用类型参数。

## 类型参数

类型参数是一种特殊的参数,它可以接受任意类型的值。我们可以在函数、结构体、接口等地方使用类型参数。

```go
package main

import "fmt"

func Print[T any](v T) {
fmt.Println(v)
}

func main() {
Print(42)
Print("hello")
}
```

在这个例子中,我们定义了一个 `Print` 函数,它接受一个类型参数 `T`,然后打印这个参数的值。我们可以在调用这个函数时传入任意类型的值。

## 类型约束

类型约束是一种限制类型参数的方式,它可以让我们指定类型参数必须满足的条件。我们可以使用类型约束来限制类型参数的行为,比如指定类型参数必须实现某个接口。

```go
package main

import "fmt"

type Stringer interface {
String() string
}

func Print[T Stringer](v T) {
fmt.Println(v.String())
}

type MyString string

func (s MyString) String() string {
return string(s)
}

func main() {
Print(MyString("hello"))
}
```

在这个例子中,我们定义了一个 `Stringer` 接口,它包含一个 `String` 方法。然后我们定义了一个 `Print` 函数,它接受一个类型参数 `T`,并要求这个类型参数必须实现 `Stringer` 接口。最后我们定义了一个 `MyString` 类型,并实现了 `String` 方法,然后调用 `Print` 函数。

Go 还提供了一些内置的类型约束,比如 `comparable``ordered``numeric` 等。我们可以使用这些内置的类型约束来限制类型参数的行为。

```go
package main

import "fmt"

func Min[T comparable](a, b T) T {
if a < b {
return a
}
return b
}

func main() {
fmt.Println(Min(42, 24))
}
```

此外,我们还可以使用 `any` 关键字来指定类型参数必须是任意类型。

## 总结

Go 泛型是一个非常强大的特性,它可以让我们编写更加通用和灵活的代码。通过类型参数和类型约束,我们可以实现更加灵活的代码复用和更加安全的类型检查。

## 参考资料

1. [Tutorial: Getting started with generics - The Go Programming Language](https://go.dev/doc/tutorial/generics)
2 changes: 0 additions & 2 deletions content/posts/python-grammar.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ draft = false
mermaid = true
+++

# Python 语法介绍

语法(Grammar),是一门编程语言的基础,它指定了解释器如何解释源代码。Python 语法简洁明了,易于学习和使用,但是也有一些特殊的地方,需要特别注意。

## Grammar 语法
Expand Down
2 changes: 0 additions & 2 deletions content/posts/why-not-use-async-trait.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ tags = ['Rust', 'Async', 'Trait', 'async-trait', 'trait_variant']
draft = false
+++

# 为什么不要使用 async-trait?

## async-trait

编写 Rust 异步代码时,我们通常会使用 `async` 关键字来定义异步函数,这样可以让函数返回一个 `Future` 对象,然后我们可以通过 `.await` 方法来等待这个 `Future` 对象的结果。但是有时候我们可能会想要在 trait 中定义异步函数,这时候,作为以前的标准做法,我们会使用 `async-trait` crate 来实现这个功能。
Expand Down

0 comments on commit f3a6dc0

Please sign in to comment.