Golang中如何标记当前位置?求更好的解决方案
Golang中如何标记当前位置?求更好的解决方案 如果我在论坛上阅读一篇篇幅较长的文章,但时间不够读完,有没有办法标记我的阅读位置,以便稍后回来继续阅读?
有趣。
我认为收藏相应的帖子是解决方案之一。而且这个网站将其整合得非常好。
“我认为收藏对应的帖子是解决方案之一。这个网站很好地整合了这个功能。”
我不明白这是什么意思。
我不是指收藏文章。我的意思是在我停止阅读的地方添加一个书签,这样当我回来时就能找到之前阅读的位置。
在每个帖子下方都有一个省略号按钮(…),点击它会显示"标记"或"收藏"该帖子的按钮。
要访问您的收藏列表,您需要点击网站右上角的头像,然后点击菜单中的收藏图标。在那里您会看到您的收藏列表。随着您的进展,您需要手动删除它们。
此外,这些收藏链接指向您收藏的整个帖子,而不是帖子中的特定段落。如果您需要在段落甚至行级别进行收藏,您需要使用外部工具。不过我对这些工具并不了解,因为我倾向于不收藏而是直接搜索。
曾经有一段时间,我会收藏任何我认为有趣或值得记住的内容。除了每年整理时我会访问所有收藏并删除那些已失效的链接外,我几乎从不查看这些收藏。
经过多年这样的做法后,我意识到我只是在堆积收藏,而仍然一直在使用我喜欢的搜索引擎进行查询。浏览前几个搜索结果来找到解决我问题的文章,通常比检查我的收藏中是否已有相关内容要快得多…
不过我现在做的是维护一个"待读"和"待看"列表。这是一个我仍然想要阅读/收听/观看的文章、视频甚至播客的列表。当我有大块时间时,我会消费这些内容。这通常发生在商务旅行期间晚上在酒店时,或者当我的车坏了需要乘坐公交和火车通勤时 😉
我尝试不去记住每个细节,只试图记住文章的大致框架。如果需要的话,我以后会找到它。
不过我必须诚实地说,这种通过"一无所知"来"知晓一切"的技巧不是可以学会的,要么适合你要么不适合。我不想说服您尝试它,只是想告诉您我们中一些人的内部工作方式。在我的同事中,几乎每个人都以这种方式"思考"和"记忆"事物。当然,我们各自都有一些经验和知识。
在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"})
}
这些方案提供了从简单到复杂的阅读位置标记实现,可以根据具体需求选择合适的方案。文件存储适合单机应用,数据库方案适合需要持久化和多用户支持的场景。

