golang轻量级HackerNews API客户端插件库go-hacknews的使用

golang轻量级HackerNews API客户端插件库go-hacknews的使用

简介

go-hacknews是一个用于HackerNews API的轻量级Go客户端工具库。

安装

使用go get命令安装:

go get github.com/PaulRosset/go-hacknews

使用示例

下面是一个完整的示例代码,展示如何使用go-hacknews获取HackerNews的top stories:

package main

import (
    "fmt"
    "github.com/PaulRosset/go-hacknews"
)

func main() {
    // 初始化结构体,指定想要的故事类型
    // (topstories/newstories/beststories/askstories/showstories/jobstories)
    // 以及想要获取的帖子数量
    init := hacknews.Initializer{"topstories", 10}

    // 获取帖子ID列表
    // 如果成功返回包含帖子ID的int切片,否则返回错误
    codes, err := init.GetCodesStory()
    if err != nil {
        fmt.Println(err)
        return
    }

    // 根据上面获取的ID获取帖子内容
    // 如果成功返回Post类型的切片,否则返回错误
    posts, err := init.GetPostStory(codes)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 遍历切片获取需要的信息
    // 这里获取帖子的标题和URL,但可以访问官方HackerNews API的所有字段
    // 注意:如果没有数据,字段将为空
    for _, post := range posts {
        fmt.Printf("Title : %v // Url : %v\n", post.Title, post.Url)
    }
}

测试

运行测试:

go test

许可证

MIT许可证


更多关于golang轻量级HackerNews API客户端插件库go-hacknews的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级HackerNews API客户端插件库go-hacknews的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-hacknews: 轻量级HackerNews API客户端库

go-hacknews是一个简单易用的Golang库,用于访问HackerNews API(v0)。它提供了简洁的接口来获取HackerNews上的热门故事、最新故事、提问等内容。

安装

go get github.com/PaulRosset/go-hacknews

基本使用示例

1. 初始化客户端

package main

import (
	"fmt"
	"github.com/PaulRosset/go-hacknews"
)

func main() {
	// 创建客户端实例
	client := hacknews.Init()
	
	// 获取前10个热门故事
	stories, err := client.TopStories(10)
	if err != nil {
		fmt.Printf("Error getting top stories: %v\n", err)
		return
	}
	
	// 打印故事详情
	for _, story := range stories {
		fmt.Printf("Title: %s\nURL: %s\nScore: %d\n\n", 
			story.Title, story.Url, story.Score)
	}
}

2. 获取不同类型的故事

// 获取最新故事
newStories, err := client.NewStories(10)

// 获取最佳故事
bestStories, err := client.BestStories(10)

// 获取Ask HN故事
askStories, err := client.AskStories(10)

// 获取Show HN故事
showStories, err := client.ShowStories(10)

// 获取工作招聘信息
jobStories, err := client.JobStories(10)

3. 获取单个项目详情

// 获取特定ID的条目详情
item, err := client.Item(8863)
if err != nil {
    fmt.Printf("Error getting item: %v\n", err)
    return
}

fmt.Printf("Item ID: %d\nType: %s\nTitle: %s\n", 
    item.Id, item.Type, item.Title)

4. 获取用户信息

// 获取用户信息
user, err := client.User("pg")
if err != nil {
    fmt.Printf("Error getting user: %v\n", err)
    return
}

fmt.Printf("User: %s\nKarma: %d\nCreated: %d\n", 
    user.Id, user.Karma, user.Created)

高级用法

1. 并发获取多个故事

func fetchConcurrently(client *hacknews.Client, ids []int) ([]hacknews.Item, error) {
	var wg sync.WaitGroup
	items := make([]hacknews.Item, len(ids))
	errChan := make(chan error, len(ids))
	
	for i, id := range ids {
		wg.Add(1)
		go func(index, itemID int) {
			defer wg.Done()
			item, err := client.Item(itemID)
			if err != nil {
				errChan <- err
				return
			}
			items[index] = item
		}(i, id)
	}
	
	wg.Wait()
	close(errChan)
	
	for err := range errChan {
		if err != nil {
			return nil, err
		}
	}
	
	return items, nil
}

2. 自定义HTTP客户端

func main() {
	// 创建自定义HTTP客户端
	customHTTP := &http.Client{
		Timeout: 30 * time.Second,
	}
	
	// 使用自定义HTTP客户端初始化
	client := hacknews.InitClient(customHTTP)
	
	// 使用客户端...
}

错误处理

stories, err := client.TopStories(10)
if err != nil {
    // 检查特定类型的错误
    if _, ok := err.(*hacknews.APIError); ok {
        fmt.Println("HackerNews API error:", err)
    } else if _, ok := err.(*hacknews.DecodeError); ok {
        fmt.Println("JSON decode error:", err)
    } else {
        fmt.Println("Network or other error:", err)
    }
    return
}

性能考虑

  1. 批量获取故事ID后再并发获取详情可以提高性能
  2. 考虑实现简单的缓存机制避免重复请求
  3. 合理设置HTTP客户端超时时间

完整示例

package main

import (
	"fmt"
	"log"
	"time"
	
	"github.com/PaulRosset/go-hacknews"
)

func main() {
	// 初始化客户端
	client := hacknews.Init()
	
	// 获取前5个Ask HN故事
	fmt.Println("Fetching top 5 Ask HN stories...")
	askStories, err := client.AskStories(5)
	if err != nil {
		log.Fatalf("Error fetching Ask HN stories: %v", err)
	}
	
	// 打印故事详情
	for i, story := range askStories {
		fmt.Printf("\n%d. %s (by %s)\n", i+1, story.Title, story.By)
		fmt.Printf("   Score: %d | Comments: %d\n", story.Score, story.Descendants)
		fmt.Printf("   URL: https://news.ycombinator.com/item?id=%d\n", story.Id)
		fmt.Printf("   Posted: %s\n", time.Unix(story.Time, 0).Format("2006-01-02 15:04:05"))
	}
}

go-hacknews是一个轻量级的库,非常适合快速集成HackerNews内容到你的Golang应用中。它的简单API设计使得获取HackerNews数据变得非常容易,同时保持了足够的灵活性来处理各种用例。

回到顶部