https://wiki.jikexueyuan.com/project/the-way-to-go/10.7.html
当定义了一个有很多方法的类型时,十之八九你会使用 String() 方法来定制类型的字符串形式的输出,换句话说:一种可阅读性和打印性的输出。如果类型定义了 String() 方法,它会被用在 fmt.Printf() 中生成默认的输出:等同于使用格式化描述符 %v 产生的输出。还有 fmt.Print() 和 fmt.Println() 也会自动使用 String() 方法。
範例:https://play.golang.org/p/MM33SftL5GO
当你广泛使用一个自定义类型时,最好为它定义 String()方法。从上面的例子也可以看到,格式化描述符 %T 会给出类型的完全规格,%#v 会给出实例的完整输出,包括它的字段(在程序自动生成 Go 代码时也很有用)。
备注
不要在 String() 方法里面调用涉及 String() 方法的方法,它会导致意料之外的错误。
Golang: base58 編碼 & 解碼
base58 編碼 (包含解說)
https://play.golang.org/p/8l6HGHxblQM
base58 解碼 (包含解說)
https://play.golang.org/p/nv8AzrVeebn
base58 編碼 & 解碼 完整程式碼 (可運行測試)
https://play.golang.org/p/H9pLcU87ejj
比特幣存在多種地址格式
https://21st.each1.net/2019/07/blog-post_7.html
https://play.golang.org/p/_Uesr4ck2Yr
https://play.golang.org/p/8l6HGHxblQM
base58 解碼 (包含解說)
https://play.golang.org/p/nv8AzrVeebn
base58 編碼 & 解碼 完整程式碼 (可運行測試)
https://play.golang.org/p/H9pLcU87ejj
比特幣存在多種地址格式
https://21st.each1.net/2019/07/blog-post_7.html
https://play.golang.org/p/_Uesr4ck2Yr
Golang: 合併 slice 的 append 方法
範例:https://play.golang.org/p/tTMQ2l8W--B
x := []int{1, 2, 3}
y := []int{4, 5, 6}
fmt.Println(append(x, 4, 5, 6))
fmt.Println(append(x, y...))
輸出結果:
[1 2 3 4 5 6]
[1 2 3 4 5 6]
append 的用法有兩種:
slice = append(slice, 元素1, 元素2)
slice = append(slice, anotherSlice...)
第一種用法的第一個參數為 slice,後面可以添加多個元素。
第二種用法是將兩個 slice 拼接在一起,且需要在第二個 slice 的名稱後面加三個點,
這時候 append 只支持兩個 slice 拼接,不支持任意數量。
x := []int{1, 2, 3}
y := []int{4, 5, 6}
fmt.Println(append(x, 4, 5, 6))
fmt.Println(append(x, y...))
輸出結果:
[1 2 3 4 5 6]
[1 2 3 4 5 6]
append 的用法有兩種:
slice = append(slice, 元素1, 元素2)
slice = append(slice, anotherSlice...)
第一種用法的第一個參數為 slice,後面可以添加多個元素。
第二種用法是將兩個 slice 拼接在一起,且需要在第二個 slice 的名稱後面加三個點,
這時候 append 只支持兩個 slice 拼接,不支持任意數量。
觀古鑑今:同一件歷史,卻有完全相反的分析結論
30多年前,日本是如何輸掉晶片這場戰爭的?
認為是美國聯手韓國,鬥垮日本的:
https://www.techbang.com/posts/70406-how-did-japan-lose-its-chip-war-more-than-30-years-ago
認為日本不是因為美國才「輸」掉芯片戰爭,日本是輸給自己:
https://chinaqna.com/a/83585
同一件歷史,卻有完全相反的分析結論 ...
我們在這些分析與思考的過程中,學到了甚麼?
認為是美國聯手韓國,鬥垮日本的:
https://www.techbang.com/posts/70406-how-did-japan-lose-its-chip-war-more-than-30-years-ago
認為日本不是因為美國才「輸」掉芯片戰爭,日本是輸給自己:
https://chinaqna.com/a/83585
同一件歷史,卻有完全相反的分析結論 ...
我們在這些分析與思考的過程中,學到了甚麼?
Cache 和 Buffer 都是緩存,區別為何?
1、Buffer(緩衝區)是系統兩端處理速度平衡(從長時間尺度上看)時使用的。它的引入是為了減小短期內突發I/O的影響,起到流量整形的作用。比如生產者——消費者問題,他們產生和消耗資源的速度大體接近,加一個buffer可以抵消掉資源剛產生/消耗時的突然變化。
2、Cache(緩存)則是系統兩端處理速度不匹配時的一種折衷策略。因為CPU和memory之間的速度差異越來越大,所以人們充分利用數據的局部性(locality)特徵,通過使用存儲系統分級(memory hierarchy)的策略來減小這種差異帶來的影響。
3、假定以後存儲器訪問變得跟CPU做計算一樣快,cache就可以消失,但是buffer依然存在。比如從網絡上下載東西,瞬時速率可能會有較大變化,但從長期來看卻是穩定的,這樣就能通過引入一個buffer使得OS接收數據的速率更穩定,進一步減少對磁盤的傷害。
4、TLB(Translation Lookaside Buffer,後備緩衝器)名字起錯了,其實它是一個cache。
Buffer 的主要目的是進行流量整形,把突發的大數量較小規模的 I/O 整理成平穩的小數量較大規模的 I/O,以減少響應次數(比如從網上下載電影,你不能下一點點數據就寫一下硬盤,而是積攢一定數量的數據後才一整塊一起寫,不然硬碟都要被玩壞了)
2、Cache(緩存)則是系統兩端處理速度不匹配時的一種折衷策略。因為CPU和memory之間的速度差異越來越大,所以人們充分利用數據的局部性(locality)特徵,通過使用存儲系統分級(memory hierarchy)的策略來減小這種差異帶來的影響。
3、假定以後存儲器訪問變得跟CPU做計算一樣快,cache就可以消失,但是buffer依然存在。比如從網絡上下載東西,瞬時速率可能會有較大變化,但從長期來看卻是穩定的,這樣就能通過引入一個buffer使得OS接收數據的速率更穩定,進一步減少對磁盤的傷害。
4、TLB(Translation Lookaside Buffer,後備緩衝器)名字起錯了,其實它是一個cache。
Buffer 的主要目的是進行流量整形,把突發的大數量較小規模的 I/O 整理成平穩的小數量較大規模的 I/O,以減少響應次數(比如從網上下載電影,你不能下一點點數據就寫一下硬盤,而是積攢一定數量的數據後才一整塊一起寫,不然硬碟都要被玩壞了)
Golang: Println、Printf、Sprintf (格式化輸出)
https://studygolang.com/articles/16080
https://blog.csdn.net/zgh0711/article/details/78843361
https://www.jianshu.com/p/9637c18d5f01
https://blog.csdn.net/chenbaoke/article/details/39932845
Println:可以打印出字符串,和变量
Printf:只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整形
也就是说,当需要格式化输出信息时一般选择 Printf,其他时候用 Println
fmt.Sprintf(格式化样式, 参数列表…)
格式化样式:字符串形式,格式化动词以%开头。
参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则运行时会报错。
代码输出如下:
下表中标出了常用的一些格式化样式中的动词及功能。
https://blog.csdn.net/zgh0711/article/details/78843361
https://www.jianshu.com/p/9637c18d5f01
https://blog.csdn.net/chenbaoke/article/details/39932845
Println:
1. 用默认的类型格式显示方式将传入的参数写入到标准输出里面(即在终端中有显示),
2. 多个传入参数之间使用空格分隔,
3. 在显示的最后追加换行符,
4. 返回值为 写入标准输出的字节数和写入过程中遇到的问题。
Printf:
1. 用传入的格式化规则符将传入的变量写入到标准输出里面(即在终端中有显示),
2. 返回值为 写入标准输出的字节数和写入过程中遇到的问题。
Sprintf:
1. 用传入的格式化规则符将传入的变量格式化,(终端中不会有显示)
2. 返回为 格式化后的字符串。
Println:可以打印出字符串,和变量
Printf:只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整形
也就是说,当需要格式化输出信息时一般选择 Printf,其他时候用 Println
fmt.Sprintf(格式化样式, 参数列表…)
格式化样式:字符串形式,格式化动词以%开头。
参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则运行时会报错。
var progress = 2
var target = 8
// 两参数格式化
title := fmt.Sprintf("已采集%d个药草, 还需要%d个完成任务", progress, target)
fmt.Println(title)
pi := 3.14159
// 按数值本身的格式输出
variant := fmt.Sprintf("%v %v %v", "月球基地", pi, true)
fmt.Println(variant)
// 匿名结构体声明, 并赋予初值
profile := &struct {
Name string
HP int
}{
Name: "rat",
HP: 150,
}
fmt.Printf("使用'%%+v' %+v\n", profile)
fmt.Printf("使用'%%#v' %#v\n", profile)
fmt.Printf("使用'%%T' %T\n", profile)
已采集2个药草, 还需要8个完成任务
"月球基地" 3.14159 true
使用'%+v' &{Name:rat HP:150}
使用'%#v' &struct { Name string; HP int }{Name:"rat", HP:150}
使用'%T' *struct { Name string; HP int }C语言中, 使用%d代表整型参数
"月球基地" 3.14159 true
使用'%+v' &{Name:rat HP:150}
使用'%#v' &struct { Name string; HP int }{Name:"rat", HP:150}
使用'%T' *struct { Name string; HP int }C语言中, 使用%d代表整型参数
下表中标出了常用的一些格式化样式中的动词及功能。
| 动 词 | 功 能 |
|---|---|
| %v | 按值的本来值输出 |
| %+v | 在 %v 基础上,对结构体字段名和值进行展开 |
| %#v | 输出 Go 语言语法格式的值 |
| %T | 输出 Go 语言语法格式的类型和值 |
| %% | 输出 % 本体 |
| %b | 整型以二进制方式显示 |
| %o | 整型以八进制方式显示 |
| %d | 整型以十进制方式显示 |
| %x | 整型以十六进制方式显示 |
| %X | 整型以十六进制、字母大写方式显示 |
| %U | Unicode 字符 |
| %f | 浮点数 |
| %p | 指针,十六进制方式显示 |
Golang 環境變量
https://www.cnblogs.com/baiyuxiong/p/4545014.html
https://www.itread01.com/articles/1490395087.html
package main
import "os"
import "fmt"
func main() {
os.Clearenv()
os.Setenv("FOO", "1")
fmt.Println("FOO:", os.Getenv("FOO"))
os.Unsetenv("FOO")
fmt.Println("FOO:", os.Getenv("FOO"))
os.Setenv("hello", "1")
os.Setenv("world", "2")
fmt.Println()
for _, e := range os.Environ() {
fmt.Println(e)
}
}
输出结果:
FOO: 1
FOO:
hello=1
world=2
可以看出,调用Unsetenv后FOO就没有值了。通过for range可以遍历Environ中所有的环境变量。
上述操作,包括Clearenv只会影响程序当前运行环境中的环境变量。并不会对程序外的系统环境变量产生影响。所以当這段代码运行结束时,系统的环境变量并不会发生改变。
https://www.itread01.com/articles/1490395087.html
package main
import "os"
import "fmt"
func main() {
os.Clearenv()
os.Setenv("FOO", "1")
fmt.Println("FOO:", os.Getenv("FOO"))
os.Unsetenv("FOO")
fmt.Println("FOO:", os.Getenv("FOO"))
os.Setenv("hello", "1")
os.Setenv("world", "2")
fmt.Println()
for _, e := range os.Environ() {
fmt.Println(e)
}
}
输出结果:
FOO: 1
FOO:
hello=1
world=2
可以看出,调用Unsetenv后FOO就没有值了。通过for range可以遍历Environ中所有的环境变量。
上述操作,包括Clearenv只会影响程序当前运行环境中的环境变量。并不会对程序外的系统环境变量产生影响。所以当這段代码运行结束时,系统的环境变量并不会发生改变。
Google 的 URL 相關參數
https://developers.google.com/custom-search/docs/xml_results?hl=en&csw=1
https://sites.google.com/site/tomihasa/google-language-codes
Google Maps嵌入參數:https://jax-work-archive.blogspot.com/2011/07/google-maps.html
the tbm URL parameter appears to indicate the filter used. For example:
Applications: tbm=app
Blogs: tbm=blg
Books: tbm=bks
Discussions: tbm=dsc
Images: tbm=isch
News: tbm=nws
Patents: tbm=pts
Places: tbm=plcs
Recipes: tbm=rcp
Shopping: tbm=shop
Video: tbm=vid
| gl | |
|---|---|
| Description |
Optional. The
gl parameter value is a two-letter country code. For WebSearch results, the glparameter boosts search results whose country of origin matches the parameter value. See the Country Codes section for a list of valid values.
Specifying a
gl parameter value in WebSearch requests should improve the relevance of results. This is particularly true for international customers and, even more specifically, for customers in English-speaking countries other than the United States. |
| Examples |
This request boosts documents written in the United Kingdom in WebSearch results:
q=pizza&gl=uk |
| hl | |
|---|---|
| Description |
Optional. The
hl parameter specifies the interface language (host language) of your user interface. To improve the performance and the quality of your search results, you are strongly encouraged to set this parameter explicitly.
See the Interface Languages section of Internationalizing Queries and Results Presentation for more information and Supported Interface Languages for a list of supported languages.
|
| Examples |
This request targets ads for wine in French. (Vin is the French term for wine.)
q=vin&ip=10. |
用 Golang 的 flag 套件 建置 CLI (Command line)
在 Windows 的環境,以下列程式碼為例:
在線上可以跑出一個預設結果
word: foo
numb: 42
fork: false
svar: bar
tail: []
然後對程式碼 Ctrl+S 存檔到本機後編譯,
在 Windows cmd 環境內,
C:\Users\User\go>main.exe -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []
C:\Users\User\go>main.exe -numb=30
word: foo
numb: 30
fork: false
svar: bar
tail: []
進一步詳閱
https://www.kancloud.cn/liupengjie/go/570085
終端讀取:
1. 從鍵盤 (控制台) 輸入 fmt
2. 命令行參數 os.Args
3. 命令行參數 flag
https://blog.rapid7.com/2016/08/04/build-a-simple-cli-tool-with-golang/
進一步詳閱
https://www.kancloud.cn/liupengjie/go/570085
終端讀取:
1. 從鍵盤 (控制台) 輸入 fmt
2. 命令行參數 os.Args
3. 命令行參數 flag
https://blog.rapid7.com/2016/08/04/build-a-simple-cli-tool-with-golang/
BadgerDB
https://github.com/dgraph-io/badger
Badger v1.0於2017年11月發布。
Badger is stable and is being used to serve data sets worth hundreds of terabytes. Badger supports concurrent ACID transactions with serializable snapshot isolation (SSI) guarantees. A Jepsen-style bank test runs nightly for 8h, with --race flag and ensures maintainance of transactional guarantees. Badger has also been tested to work with filesystem level anomalies, to ensure persistence and consistency.
BadgerDB 相當穩定,已經被用於數百TB的數據集。Badger 支持具有可序列化快照隔離(SSI)保證的並發 ACID 事務。 Jepsen風格的銀行測試每晚運行8小時,帶有--race標誌並確保維護交易保證。Badger 還經過測試,可以處理文件系統級異常,以確保持久性和一致性。
一个高性能的 LSM K/V store
https://colobu.com/2017/10/11/badger-a-performant-k-v-store/
这是 dgraph.io 开发的一款基于 log structured merge (LSM) tree 的 key-value 本地数据库, 使用 Go 开发。
事实上,市面上已经有一些知名的基于 LSM tree 的 k/v数据库, 比如 leveldb、goleveldb、rocksdb,既然已经有了一些优秀的开源的LSM tree的项目,为什么dgraph还要创建一个新的轮子呢?
答案是: 更好的性能。
Badger v1.0於2017年11月發布。
Badger is stable and is being used to serve data sets worth hundreds of terabytes. Badger supports concurrent ACID transactions with serializable snapshot isolation (SSI) guarantees. A Jepsen-style bank test runs nightly for 8h, with --race flag and ensures maintainance of transactional guarantees. Badger has also been tested to work with filesystem level anomalies, to ensure persistence and consistency.
BadgerDB 相當穩定,已經被用於數百TB的數據集。Badger 支持具有可序列化快照隔離(SSI)保證的並發 ACID 事務。 Jepsen風格的銀行測試每晚運行8小時,帶有--race標誌並確保維護交易保證。Badger 還經過測試,可以處理文件系統級異常,以確保持久性和一致性。
一个高性能的 LSM K/V store
https://colobu.com/2017/10/11/badger-a-performant-k-v-store/
这是 dgraph.io 开发的一款基于 log structured merge (LSM) tree 的 key-value 本地数据库, 使用 Go 开发。
事实上,市面上已经有一些知名的基于 LSM tree 的 k/v数据库, 比如 leveldb、goleveldb、rocksdb,既然已经有了一些优秀的开源的LSM tree的项目,为什么dgraph还要创建一个新的轮子呢?
答案是: 更好的性能。
Go语言高级编程 (Advanced Go Programming)
https://wiki.jikexueyuan.com/project/the-way-to-go/12.11.html
Gob 是 Go 自己的以二进制形式序列化和反序列化程序数据的格式;可以在 encoding 包中找到。这种格式的数据简称为 Gob (即 Go binary 的缩写)。
https://play.golang.org/p/x2msH84z2lZ
https://chai2010.cn/advanced-go-programming-book/
https://www.gitbook.com/book/chai2010/advanced-go-programming-book/
本书涵盖CGO、Go汇编语言、RPC实现、Web框架实现、分布式系统等高阶主题,针对Go语言有一定经验想深入了解Go语言各种高级用法的开发人员。对于刚学习Go语言的读者,建议先从《Go语言圣经》开始系统学习Go语言的基础知识。如果希望了解Go2的最新动向,可以参考《Go2编程指南》。
Gob 是 Go 自己的以二进制形式序列化和反序列化程序数据的格式;可以在 encoding 包中找到。这种格式的数据简称为 Gob (即 Go binary 的缩写)。
https://play.golang.org/p/x2msH84z2lZ
https://chai2010.cn/advanced-go-programming-book/
https://www.gitbook.com/book/chai2010/advanced-go-programming-book/
本书涵盖CGO、Go汇编语言、RPC实现、Web框架实现、分布式系统等高阶主题,针对Go语言有一定经验想深入了解Go语言各种高级用法的开发人员。对于刚学习Go语言的读者,建议先从《Go语言圣经》开始系统学习Go语言的基础知识。如果希望了解Go2的最新动向,可以参考《Go2编程指南》。
訂閱:
文章 (Atom)
程式語言編年史
程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...

