site logo

Keep doing what you want, never give up.

招聘会
文章配图

Docker中的Go程序如何连接宿主机MongoDB

某些业务场景中我们需要从Docker内部连接宿主机上运行的MongoDB数据库,这时就需要使用一个特殊的host名来进行连接,即 host.docker.internal host.docker.internal 是一个特殊的主机名,它可以用来访问运行Docker容器的主机的本地网络资源。 package db import ( "context" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func NewClient() (*mongo.Client, error) { ctx, _ := context.WithTimeout(context.Background(), 3*time.Second) credential := options.Credential{ AuthSource: "admin", Username: "数据库用户名", Password: "数据库密码", } clientOpts := options.Client().ApplyURI("host.docker.internal:27017").SetAuth(credential) client, err := mongo.Connect(ctx, clientOpts) return client, err }
文章配图

Hugo自定义404页面

要在Hugo主题中添加自定义404页面非常简单,只需要在主题目录中添加一个404的html模版即可: {{ theme }}/layouts/404.html {{ define "main" }} <main> <br><br> <h1>We couldn't find this Page!</h1> <p> Please try our search page to look for it or go back to the <a href="/">home page</a>. </p> </main> {{ end }} 可以查看本站点的404页面示例 https://www.gopherloveapple.com/404
文章配图

在文章中添加HTML代码片段

有一种非常简单的语法可以直接在Markdown文档中显示HTML或任意代码片段还自带高亮 ```HTML <div>Welcome to <strong>Gopher ❤️ Apple</strong></div> ``` 其中三个连续的反引号是固定的,开始反引号后面的HTML可以自定义(比如可以是Go、Swift、CSS等等),最终Hugo构建后渲染出来的效果如下所示: <div>Welcome to <strong>Gopher ❤️ Apple</strong></div>
文章配图

给文章添加字数统计和大致的阅读时间

给博客文章添加字数统计和阅读时长可以大致告诉你的读者这篇文章有多长。这在Hugo模版中很容易就可以实现。 添加文章字数统计 让我们在文章详情页添加字数统计 {{ .WordCount }} 字 输出类似:108 字 添加文章阅读时间 同样可以使用Hugo内置函数完成 {{ .ReadingTime }} 分钟 输出类似:5 分钟
文章配图

在不破坏已有SEO的基础上如何修改文章的URL地址

有时候由于我们拼写错误或疏忽大意生成了错误的文章地址,但当时并没有发现,过了一段时间被Google等搜索引擎收录后才发现。或者就是想给之前的文章改个URL地址,但此时搜索引擎已经收录了错误的地址,那有什么办法是即不能让之前已经在网络上传播的链接无法访问又可以通过修改的新链接访问呢,这时候就该派 aliases 上场了。 换句话说 aliases 其实就类似Nginx或Apache中的URL重定向,会将某个URL的访问重定向到另外一个URL。 +++ title = '在不破坏已有SEO的基础上如何修改文章的URL地址' url = '/the-valid-url/' aliases = ['/the-invalid-url'] +++ 简单的通过 aliase 设置我们就可以同时访问这两个URL且不会破坏之前的SEO啦。
文章配图

在Hugo Theme中使用页面级Parameters参数

在Hugo Template模版中我们可以直接访问在md文件中定义的Params参数,这些参数是通过在每个md文件头部的叫做front matter元数据的位置定义的。 这里举例说明使用方法,假定有一个叫example.md的Markdown文件,内容如下: +++ title: "My First Post" date: 2024-04-29 meta_image: "/images/20240429001/hugo.png" +++ 然后我们就可以直接通过 {{ .Params.meta_image }} 这样的方式来引用这张图片,这句代码在实际构建时会被替换成 /images/20240429001/hugo.png 在模版中显示图片: <img src="{{ .Params.meta_image }}" />
文章配图

面试官:main函数的输出结果是什么,为什么?

以下main函数的输出结果是什么? func main() { runtime.GOMAXPROCS(1) var wg sync.WaitGroup wg.Add(3) go func(n int) { println(n) wg.Done() }(1) go func(n int) { println(n) wg.Done() }(2) go func(n int) { println(n) wg.Done() }(3) wg.Wait() } 答案:312 解析:任务队列的优先级有三种 - P.runnext、P.runq以及全局的Schedt.runq,schedule调度时除了每隔一段就尝试从全局队列中去获取g外,还会尝试从本地队列中获取g,P.runnext的优先级更高,然后是队列的头部取。