go语言博客来源 go博客开发教程

基于hugo搭建个人站点以前使用wordpress搭建网站,插件太多,完善起来比较费时费力 。现在,静态博客也很受欢迎,hugo就是GO语言开发的一个静态博客生成器 。
mackbook上直接使用 brew install hugo 安装hugo,安装完成后使用 hugo version 来查看hugo的版本 。
在Github目录下打开终端,或者cd到Github目录下:
hugo new site site_name
其中,si te_name为github账号名称加上 .github.io , 例如:
hugo new site gary-hertel.github.io
创建成功后会显示一些信息,诸如:
这就表示站点已经创建成功了 。
然后进入到站点目录:
cd gary-hertel.github.io
使用 tree 查看目录结构如下:
接下来需要为我们的网站指定一个主题 , 这里我们选择 even 这个主题:
git clonethemes/even
将该主题增加到网站的配置文件中,这样才能生效:
echo 'theme = "even"'config.toml
测试下是否成功,运行:
hugo serve
这里是按照别的教程操作的,但是发生了报错,查看even这个主题的文档后发现有如下内容:
这里提示我们查看 themes/even/exampleSite 目录下有一个示例的 config 配置文件,我们需要将这个文件复制到站点根目录,覆盖原文件,这样才能够使站点生效 。配置文件中的信息可以查看一下,然后进行相应的修改 。
在站点根目录:
hugo new post/first_article.md
查看 gary-hertel.github.io/content/post 目录下新增了一个 first_article.md 的markdown文档,打开之后对其进行编辑即可,注意将 draft:true 修改为 false .
撰写文章的方法就是通常开发者常用的markdown格式 。
在站点根目录下:
Hugo serve
然后就可以在浏览器中输入进行查看了,在撰写文章或者进行配置修改等等操作时,内容会自动更新 。
hugo -d docs
静态页面会保存至站点根目录下的docs文件夹 。
每次更新后我们都需要执行一下这条命令 。
在github上新建一个公开仓库,名为github用户名加上 .github.io,例如 gary-hertel.github.io
在仓库的settings的pages设置中,Source那里设置为:
说明如下:
使用hugo搭建个个人博客还是不错的 , 一开始要花些时间折腾和摸索 , 后续就使用起来比较方便了,也不需要购买服务器去部署 , 部署在github上可能国内访问较慢,可以考虑部署到gitee.
Go语言能在中国这么火是因为什么?go语言之所以能成为我国最火的语言 , 是因为编写服务端高并发程序的优势 。我大中华区但凡pv,日活高点的网站,应用 , 谁没点这个需求 。这个领域中最优的几个:golang,erlang,rust 。日常生活中人类社交是当今社会上的必然性,人们也伴随着科技时代的发展,智能电子产品的使用中也必然少不了语言输入,文字的编辑,语言转换的便利都均可来源于go语音输入法 。
国内大学本科教育,哪个学校不以c/c为入门教学语言 。都十几年了 , 谭浩强还在大卖 。语法相近的语言总是学习和使用成本最低的 。这一点非常重要 。coursera上有一门程序设计语言理论课上,开篇就阐述了这一点的重要性 。假设go的入门成本是一个月,erlang的入门成本是2个月,那么整个程序员群体在学习后者的付出成本就很可观了 。
google由于众所周知的原因 , 在国内程序员中不一般的地位 。golang有个好背景 。
go语言之前一直都没有接受待见,如今广大的群众开始接待,因为腾讯服务器段代码编译是支持go语言的
go语言会成为主流也是一个问题,
多虑了,没有竞争来关系 。
虽然go成为源了世界上最并发的语言,这并不妨碍php成为世界上最好的语言,
也不妨碍java成为世界上最有模式的语言,
更不会妨碍c成为21天就能学会了的语言 。为什么Go语言如此不受待见
其实并没有不受待见,用的人还是很多的 , 解决一些特定领域的问题也很方便 。
每种语言的流行程度主要取决于这个语言最著名的killerapp的流行程度,C有Linux,Go有Docker 。
利用GitHub-Actions将Hugo博客自动发布到GitHub和Gitee Pages 现在个人博客通常有比较多的选择,如果不想要自己购买服务器实现静态博客的发布,可以在、CSDN等平台建立自己的账号并发布,但是原始数据无法在本地管理go语言博客来源;如果想要数据完全自己管理,可以使用GitHub或者Gitee Pages功能发布自己的博客,利用Hugo或Hexo等成熟的静态博客将md文件转换成静态网站文件进行快速发布 。本文就用来记录如何快速将博客发布到、GitHub以及Gitee Pages三个平台 。
我希望的流程当然是主要精力用在写文章,发布的流程最好完全不需要手动处理,但实际情况下手动发布博客的流程大体是go语言博客来源:
之前有使用过Travis CI GitHub Hexo自动发布到GitHub Pages,但是GitHub的访问经常不那么靠谱 , 因此想着也能同步到Gitee , 并且自动构建Hexo的速度受Nodejs环境部署影响 , 速度很慢,因此本次计划采用Hugo来构建网站文件,整体流程设计如下:
为了满足博客自动发布流程,首先需要在本地准备好生产环境,以满足快速发布,以此的复杂是为了长期的简单,因此在环境准备阶段我会把所有涉及的工具都记录下来,以方便大家使用以及后边自己回顾,环境准备包含:
Obsidian完成知识积累后,按照ZK-Project-Archive-Blog的流程发布Blog,但是Obsidian的文件相互关联,且附件如何快速复用,需要对Typora和Obsidian都进行简单的配置,确保后续Blog能够快速完成并发布,并且文件仍在Obsidian工程中正常显示;
Typora非常的简洁,而且可以实时预览,在写博客的时候经常会插入一些图片,截图后可以直接粘贴进去,图片也会自动保存在本地,这里需要注意图片的保存路径,在偏好设置里,设置插入图片时复制到指定路径(./resource/),这样复制的图片就会自动保存在当前文件夹下的resource文件夹里,方便后续管理与转移 。
在.ssh文件生成id_rsa和id_rsa.pub两个文件;
Hugo 是一个基于Go语言开发的静态博客框架,号称世界上最快的构建网站工具;
命令为: hugo new site myblog
myblog为博客的目录名,可以修改为go语言博客来源你自己想取的名字,生成的目录如下:
由于默认主题生成的文章页面有些功能是不需要的,因此需要对themes下文件进行修改:
将config、content和themes三个目录拷贝到新创建的站点目录,将content下替换为文章文件即可 。
utterances 是一款基于Github Issue的Github工具,优点主要是无广告、加载快、配置简单,轻量开源 。
由于 utterances 是一款Github App , 因此 安装utterances 非常简单 , 只需要授权特定repo权限给 utterances 就可以了,注意一个点:授权的这个repo必须是public的 , 可以选择多个repo,但是建议选择一个就可以了,也比较安全 。
这是当前最简单的配置方法,也可以在 utterances官方 查看其他配置方法,以及详细的配置参数说明 。
Obsidian的安装和使用可参考我的另一篇文章: Obsidian作为第二大脑工具的基本使用和配置
所有环境准备好后,终于要开始启动我们的自动化流程的实现了;
同之前步骤相同,将Gitee密码配置到GitHub Secrets,命名为:GITEE_PASSWORD,所有配置结果如下:
synctogitee.yml
需要绑定Gitee账号到微信公众号,否则最后一步reload pages自动部署Gitee Pages会登录失败,原因是需要短信验证;绑定公众号后则不需要短信验证;其他问题解决可以参考 gitee-pages-action
在Typora完成文章编写后 , 一键上传所有图片到Gitee图床,拷贝发布到,然后提交到GitHub repo master分支,即可自动部署到GitHub和Gitee Pages;
以上就是我利用GitHub-Actions将Hugo博客自动发布到GitHub和Gitee Pages , 希望可以帮助大家快速构建自己的个人网站;后边我会继续完善我的第二大脑系统的构建思路和方法 。
如何看待go语言泛型的最新设计?Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成为现实 。Go 团队实施了一个看起来比较稳定的设计草案 , 并且正以源到源翻译器原型的形式获得关注 。本文讲述的是泛型的最新设计,以及如何自己尝试泛型 。
例子
FIFO Stack
假设你要创建一个先进先出堆栈 。没有泛型,你可能会这样实现:
type Stack []interface{}func (s Stack) Peek() interface{} {
return s[len(s)-1]
}
func (s *Stack) Pop() {
*s = (*s)[:
len(*s)-1]
}
func (s *Stack) Push(value interface{}) {
*s =
append(*s, value)
}
但是,这里存在一个问题:每当你 Peek 项时,都必须使用类型断言将其从 interface{} 转换为你需要的类型 。如果你的堆栈是 *MyObject 的堆栈 , 则意味着很多 s.Peek().(*MyObject)这样的代码 。这不仅让人眼花缭乱,而且还可能引发错误 。比如忘记 * 怎么办?或者如果您输入错误的类型怎么办?s.Push(MyObject{})` 可以顺利编译,而且你可能不会发现到自己的错误 , 直到它影响到你的整个服务为止 。
通常 , 使用 interface{} 是相对危险的 。使用更多受限制的类型总是更安全 , 因为可以在编译时而不是运行时发现问题 。
泛型通过允许类型具有类型参数来解决此问题:
type Stack(type T) []Tfunc (s Stack(T)) Peek() T {
return s[len(s)-1]
}
func (s *Stack(T)) Pop() {
*s = (*s)[:
len(*s)-1]
}
func (s *Stack(T)) Push(value T) {
*s =
append(*s, value)
}
这会向 Stack 添加一个类型参数 , 从而完全不需要 interface{} 。现在,当你使用 Peek() 时,返回的值已经是原始类型,并且没有机会返回错误的值类型 。这种方式更安全,更容易使用 。(译注:就是看起来更丑陋 , ^-^)
此外,泛型代码通常更易于编译器优化,从而获得更好的性能(以二进制大小为代价) 。如果我们对上面的非泛型代码和泛型代码进行基准测试 , 我们可以看到区别:
type MyObject struct {
X
int
}
var sink MyObjectfunc BenchmarkGo1(b *testing.B) {
for i := 0; ib.N; i{
var s Stack
s.Push(MyObject{})
s.Push(MyObject{})
s.Pop()
sink = s.Peek().(MyObject)
}
}
func BenchmarkGo2(b *testing.B) {
for i := 0; ib.N; i{
var s Stack(MyObject)
s.Push(MyObject{})
s.Push(MyObject{})
s.Pop()
sink = s.Peek()
}
}
结果:
BenchmarkGo1BenchmarkGo1-161283752887.0 ns/op48 B/op2 allocs/opBenchmarkGo2BenchmarkGo2-162840647941.9 ns/op24 B/op2 allocs/op
在这种情况下,我们分配更少的内存,同时泛型的速度是非泛型的两倍 。
合约(Contracts)
上面的堆栈示例适用于任何类型 。但是,在许多情况下 , 你需要编写仅适用于具有某些特征的类型的代码 。例如,你可能希望堆栈要求类型实现 String() 函数
【go语言博客来源 go博客开发教程】关于go语言博客来源和go博客开发教程的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读