
大家好,我是猫头虎,今天要和大家分享一个振奋人心的消息:所有 ChatGPT 免费用户现在可以使用 GPT 商店中的 GPT 了!这真的是一个巨大的突破,让我们一起来看看这个激动人心的时刻吧。
GPT 商店向所有用户开放
今天早上,我像往常一样浏览新闻,突然看到 OpenAI 的一个重大公告:他们已经向所有 ChatGPT 用户开放了 GPT 商店中的所有 GPT!这意味着什么呢?简单来说,就是每周超过 1 亿的活跃用户现在都可以免费浏览和使用这些 GPT 了。无论是学习新知识、娱乐,还是提高工作效率,现在都变得更加容易了。
全新的 GPT-4o 模型
这次更新不仅仅是开放了 GPT 商店,OpenAI 还推出了他们最新的旗舰型号 GPT-4o。这个新模型带来了更强大的性能和更多的可能性。作为一名技术爱好者,我迫不及待地想要测试这个新模型,看看它能带来怎样的惊喜。不过,考虑到使用量的增加和行为的变化,大家还是要花点时间检查和测试自己的 GPT,确保它们能按预期运行。
对创作者的感谢
在这里,我要特别感谢所有为 GPT 商店做出贡献的创作者们。正是因为有了你们的创新和努力,全球用户才能享受到这些精彩的 GPT。你们的工作对于我们的社区至关重要,我们期待看到你们的 GPT 如何继续丰富全球用户的体验。
注意事项
需要提醒大家的是,虽然 GPT 商店全面开放了,但 DALL·E 的绘画功能目前仍无法使用。不过,其他所有的 GPT 功能都可以正常使用,希望大家在体验过程中多多反馈问题和建议。
值得注意的是,和上次的 GPT-4o 一样,目前仍处于部分灰度发布阶段。近期新注册的账号依然无法使用。我测试了两个免费账号,一个是去年注册的账号,功能正常。
界面如下:
测试使用代码生成器:

生成的结果如下:
好的,让我们开始实现雪花算法(Snowflake Algorithm)在Go语言中的代码。雪花算法是一种分布式唯一ID生成算法,由Twitter开发。它生成的ID是64位的整数,保证了分布式系统中唯一性和有序性。
我们将分为以下几个步骤来实现:
定义常量:定义雪花算法中各部分的位数和最大值。 定义结构体:定义Snowflake结构体,包含生成ID所需的参数。 初始化函数:实现初始化函数来配置Snowflake生成器。 生成ID函数:实现生成ID的主要逻辑。 步骤 1: 定义常量
epoch int64 = 1288834974657 // 起始时间戳(毫秒),一般设置为某个特定时间点
workerIdBits uint = 5 // 机器ID所占的位数
datacenterIdBits uint = 5 // 数据中心ID所占的位数
sequenceBits uint = 12 // 序列号所占的位数
maxWorkerId int64 = -1 ^ (-1 << workerIdBits) // 支持的最大机器ID数量
maxDatacenterId int64 = -1 ^ (-1 << datacenterIdBits) // 支持的最大数据中心ID数量
sequenceMask int64 = -1 ^ (-1 << sequenceBits) // 序列号的掩码
workerIdShift = sequenceBits // 机器ID左移位数
datacenterIdShift = sequenceBits + workerIdBits // 数据中心ID左移位数
timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits // 时间戳左移位数 ) ```
### 步骤 2: 定义结构体
```go type Snowflake struct {
workerId int64 // 机器ID
datacenterId int64 // 数据中心ID
sequence int64 // 序列号
lastTimestamp int64 // 上次生成ID的时间戳
mu sync.Mutex // 保证并发安全 } ```
### 步骤 3: 初始化函数
```go func NewSnowflake(workerId, datacenterId int64) (*Snowflake,
error) {
if workerId > maxWorkerId || workerId < 0 {
return nil, fmt.Errorf("worker ID can't be greater than %d or less than 0", maxWorkerId)
}
if datacenterId > maxDatacenterId || datacenterId < 0 {
return nil, fmt.Errorf("datacenter ID can't be greater than %d or less than 0", maxDatacenterId)
}
return &Snowflake{
workerId: workerId,
datacenterId: datacenterId,
sequence: 0,
lastTimestamp: -1,
}, nil } ```
### 步骤 4: 生成ID函数
go func (s *Snowflake) NextId() (int64, error) {
s.mu.Lock()
defer s.mu.Unlock()
timestamp := time.Now().UnixNano() / int64(time.Millisecond)
if timestamp < s.lastTimestamp {
return 0, fmt.Errorf("clock is moving backwards. Rejecting requests until %d", s.lastTimestamp)
}
if s.lastTimestamp == timestamp {
s.sequence = (s.sequence + 1) & sequenceMask
if s.sequence == 0 {
for timestamp <= s.lastTimestamp {
timestamp = time.Now().UnixNano() / int64(time.Millisecond)
}
}
} else {
s.sequence = 0
}
s.lastTimestamp = timestamp
id := ((timestamp - epoch) << timestampLeftShift) |
(s.datacenterId << datacenterIdShift) |
(s.workerId << workerIdShift) |
s.sequence
return id, nil }
### 完整代码
go package main
import (
"fmt"
"sync"
"time" )
const (
epoch int64 = 1288834974657
workerIdBits uint = 5
datacenterIdBits uint = 5
sequenceBits uint = 12
maxWorkerId int64 = -1 ^ (-1 << workerIdBits)
maxDatacenterId int64 = -1 ^ (-1 << datacenterIdBits)
sequenceMask int64 = -1 ^ (-1 << sequenceBits)
workerIdShift = sequenceBits
datacenterIdShift = sequenceBits + workerIdBits
timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits )
type Snowflake struct {
workerId int64
datacenterId int64
sequence int64
lastTimestamp int64
mu sync.Mutex }
func NewSnowflake(workerId, datacenterId int64) (*Snowflake, error) {
if workerId > maxWorkerId || workerId < 0 {
return nil, fmt.Errorf("worker ID can't be greater than %d or less than 0", maxWorkerId)
}
if datacenterId > maxDatacenterId || datacenterId < 0 {
return nil, fmt.Errorf("datacenter ID can't be greater than %d or less than 0", maxDatacenterId)
}
return &Snowflake{
workerId: workerId,
datacenterId: datacenterId,
sequence: 0,
lastTimestamp: -1,
}, nil }
func (s *Snowflake) NextId() (int64, error) {
s.mu.Lock()
defer s.mu.Unlock()
timestamp := time.Now().UnixNano() / int64(time.Millisecond)
if timestamp < s.lastTimestamp {
return 0, fmt.Errorf("clock is moving backwards. Rejecting requests until %d", s.lastTimestamp)
}
if s.lastTimestamp == timestamp {
s.sequence = (s.sequence + 1) & sequenceMask
if s.sequence == 0 {
for timestamp <= s.lastTimestamp {
timestamp = time.Now().UnixNano() / int64(time.Millisecond)
}
}
} else {
s.sequence = 0
}
s.lastTimestamp = timestamp
id := ((timestamp - epoch) << timestampLeftShift) |
(s.datacenterId << datacenterIdShift) |
(s.workerId << workerIdShift) |
s.sequence
return id, nil }
func main() {
sf, err := NewSnowflake(1, 1)
if err != nil {
fmt.Println(err)
return
}
for i := 0; i < 10; i++ {
id, err := sf.NextId()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(id)
} }
**建议的后续步骤**:
**a.** 添加单元测试来验证Snowflake算法的正确性。
**b.** 实现ID解析函数,将生成的ID解析为时间戳、机器ID和数据中心ID等信息。
未来的展望
这次 OpenAI 的举动无疑是迈向让 AI 技术更加普及的重要一步。作为一名全栈软件工程师和科技自媒体博主,我深知技术普及的重要性。相信在不久的将来,我们会看到更多的用户因为这次更新而受益,体验到 AI 技术带来的便利和乐趣。
总之,这次的 GPT 商店全面开放以及全新的 GPT-4o 模型,真的是让人兴奋不已。如果你还没有去体验,赶快去试试看吧!感谢大家的支持,我们下次再见!
👀 Call to Action: 别忘了在评论区分享你的体验和想法哦!如果你也对技术和新事物充满兴趣,欢迎关注我,和我一起探索更多的前沿科技!

期待与你们的交流!




