Golang中如何标记当前位置?求更好的解决方案

Golang中如何标记当前位置?求更好的解决方案 如果我在论坛上阅读一篇篇幅较长的文章,但时间不够读完,有没有办法标记我的阅读位置,以便稍后回来继续阅读?

6 回复

我会查看的

更多关于Golang中如何标记当前位置?求更好的解决方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


有趣。

我认为收藏相应的帖子是解决方案之一。而且这个网站将其整合得非常好。

“我认为收藏对应的帖子是解决方案之一。这个网站很好地整合了这个功能。”

我不明白这是什么意思。

我不是指收藏文章。我的意思是在我停止阅读的地方添加一个书签,这样当我回来时就能找到之前阅读的位置。

在每个帖子下方都有一个省略号按钮(),点击它会显示"标记"或"收藏"该帖子的按钮。

要访问您的收藏列表,您需要点击网站右上角的头像,然后点击菜单中的收藏图标。在那里您会看到您的收藏列表。随着您的进展,您需要手动删除它们。

此外,这些收藏链接指向您收藏的整个帖子,而不是帖子中的特定段落。如果您需要在段落甚至行级别进行收藏,您需要使用外部工具。不过我对这些工具并不了解,因为我倾向于不收藏而是直接搜索。


曾经有一段时间,我会收藏任何我认为有趣或值得记住的内容。除了每年整理时我会访问所有收藏并删除那些已失效的链接外,我几乎从不查看这些收藏。

经过多年这样的做法后,我意识到我只是在堆积收藏,而仍然一直在使用我喜欢的搜索引擎进行查询。浏览前几个搜索结果来找到解决我问题的文章,通常比检查我的收藏中是否已有相关内容要快得多…

不过我现在做的是维护一个"待读"和"待看"列表。这是一个我仍然想要阅读/收听/观看的文章、视频甚至播客的列表。当我有大块时间时,我会消费这些内容。这通常发生在商务旅行期间晚上在酒店时,或者当我的车坏了需要乘坐公交和火车通勤时 😉

我尝试不去记住每个细节,只试图记住文章的大致框架。如果需要的话,我以后会找到它。

不过我必须诚实地说,这种通过"一无所知"来"知晓一切"的技巧不是可以学会的,要么适合你要么不适合。我不想说服您尝试它,只是想告诉您我们中一些人的内部工作方式。在我的同事中,几乎每个人都以这种方式"思考"和"记忆"事物。当然,我们各自都有一些经验和知识。

在Golang中,可以通过多种方式实现阅读位置的标记和恢复。以下是几种实用的解决方案:

方案1:使用文件存储位置信息

package main

import (
    "fmt"
    "os"
    "strconv"
)

// 保存阅读位置到文件
func savePosition(position int, filename string) error {
    return os.WriteFile(filename, []byte(strconv.Itoa(position)), 0644)
}

// 从文件读取阅读位置
func loadPosition(filename string) (int, error) {
    data, err := os.ReadFile(filename)
    if err != nil {
        return 0, err
    }
    return strconv.Atoi(string(data))
}

// 使用示例
func main() {
    // 保存位置
    err := savePosition(150, "reading_position.txt")
    if err != nil {
        fmt.Println("保存位置失败:", err)
        return
    }
    
    // 读取位置
    pos, err := loadPosition("reading_position.txt")
    if err != nil {
        fmt.Println("读取位置失败:", err)
        return
    }
    fmt.Printf("从位置 %d 继续阅读\n", pos)
}

方案2:使用数据库存储

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/mattn/go-sqlite3"
)

type ReadingProgress struct {
    ArticleID string
    Position  int
}

// 初始化数据库
func initDB(db *sql.DB) error {
    _, err := db.Exec(`
        CREATE TABLE IF NOT EXISTS reading_progress (
            article_id TEXT PRIMARY KEY,
            position INTEGER
        )
    `)
    return err
}

// 保存阅读位置到数据库
func savePositionDB(db *sql.DB, articleID string, position int) error {
    _, err := db.Exec(`
        INSERT OR REPLACE INTO reading_progress (article_id, position) 
        VALUES (?, ?)
    `, articleID, position)
    return err
}

// 从数据库读取阅读位置
func loadPositionDB(db *sql.DB, articleID string) (int, error) {
    var position int
    err := db.QueryRow(`
        SELECT position FROM reading_progress 
        WHERE article_id = ?
    `, articleID).Scan(&position)
    return position, err
}

方案3:使用结构体管理多个文章的位置

package main

import (
    "encoding/json"
    "os"
    "sync"
)

type ReadingManager struct {
    Positions map[string]int `json:"positions"`
    mu        sync.RWMutex
}

// 保存位置
func (rm *ReadingManager) SavePosition(articleID string, position int) error {
    rm.mu.Lock()
    defer rm.mu.Unlock()
    
    rm.Positions[articleID] = position
    
    data, err := json.Marshal(rm.Positions)
    if err != nil {
        return err
    }
    
    return os.WriteFile("reading_progress.json", data, 0644)
}

// 读取位置
func (rm *ReadingManager) LoadPosition(articleID string) int {
    rm.mu.RLock()
    defer rm.mu.RUnlock()
    
    if position, exists := rm.Positions[articleID]; exists {
        return position
    }
    return 0
}

// 从文件加载所有位置
func (rm *ReadingManager) LoadFromFile() error {
    data, err := os.ReadFile("reading_progress.json")
    if err != nil {
        if os.IsNotExist(err) {
            rm.Positions = make(map[string]int)
            return nil
        }
        return err
    }
    
    return json.Unmarshal(data, &rm.Positions)
}

// 使用示例
func main() {
    manager := &ReadingManager{}
    err := manager.LoadFromFile()
    if err != nil {
        panic(err)
    }
    
    // 保存当前阅读位置
    manager.SavePosition("article_123", 250)
    
    // 读取位置继续阅读
    position := manager.LoadPosition("article_123")
    fmt.Printf("从位置 %d 继续阅读文章 article_123\n", position)
}

方案4:结合上下文和Web应用

package main

import (
    "context"
    "encoding/json"
    "net/http"
)

type ReadingContext struct {
    UserID    string `json:"user_id"`
    ArticleID string `json:"article_id"`
    Position  int    `json:"position"`
}

// HTTP处理器示例
func saveReadingPosition(w http.ResponseWriter, r *http.Request) {
    var ctx ReadingContext
    if err := json.NewDecoder(r.Body).Decode(&ctx); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    
    // 这里可以保存到数据库或文件
    fmt.Printf("用户 %s 在文章 %s 的阅读位置: %d\n", 
        ctx.UserID, ctx.ArticleID, ctx.Position)
    
    w.WriteHeader(http.StatusOK)
    json.NewEncoder(w).Encode(map[string]string{"status": "success"})
}

这些方案提供了从简单到复杂的阅读位置标记实现,可以根据具体需求选择合适的方案。文件存储适合单机应用,数据库方案适合需要持久化和多用户支持的场景。

回到顶部