安全
一、安全相关的基础概念
1、数据加密
2、数字签名
3、数字证书
4、PKI体系
二、通信安全
1、哈希函数
代码如下:
package main
import(
"crypto/md5"
"crypto/sha1"
"fmt"
)
func main(){
TestString:="Hi, Golang!"
Md5Inst:=md5.New()
Md5Inst.Write([]byte(TestString))
Result:=Md5Inst.Sum([]byte(""))
fmt.Printf("%x",Result)
fmt.Printf("\n")
sha1Inst:=sha1.New()
sha1Inst.Write([]byte(TestString))
Result=sha1Inst.Sum([]byte(""))
fmt.Printf("%x\n",Result)
}
运行结果:
e80c196f0227f671c4804af43bd535f7
83d59fbccf927fbe331312b70ebe2933f63a397a
代码如下:
package main
import(
"crypto/md5"
"crypto/sha1"
"fmt"
"io"
"os"
)
func main(){
fileName:="test.go"
infile,inerr:=os.Open(fileName)
if inerr==nil{
md5h:=md5.New()
io.Copy(md5h,infile)
fmt.Printf("文件“%s”的md5值为:%x",fileName, md5h.Sum([]byte("")))
fmt.Printf("\n")
sha1h:=sha1.New()
io.Copy(sha1h,infile)
fmt.Printf("文件“%s”的sha1值为:%x",fileName, sha1h.Sum([]byte("")))
fmt.Printf("\n")
}else{
fmt.Println(inerr)
os.Exit(1)
}
}
运行结果:
文件“test.go”的md5值为:4b3f99748df3c8a83fef3fb30b30232d
文件“test.go”的sha1值为:da39a3ee5e6b4b0d3255bfef95601890afd80709
2、加密通信流程
3、支持HTTPS的Web服务器
代码如下:
package main
import(
"fmt"
"net/http"
)
const SERVER_PORT=8080
const SERVER_DOMAIN="localhost"
const RESPONSE_TEMPLATE="Hello World"
func rootHandler(w http.ResponseWriter, req *http.Request){
w.Header().Set("Content-Type","text/html")
w.Header().Set("Content-Length",fmt.Sprint(len(RESPONSE_TEMPLATE)))
w.Write([]byte(RESPONSE_TEMPLATE))
}
func main(){
http.HandleFunc(fmt.Sprintf("%s:%d/",SERVER_DOMAIN,SERVER_PORT),rootHandler)
http.ListenAndServeTLS(fmt.Sprintf(":%d",SERVER_PORT),"some.crt","some.key",nil)
}
运行结果如下:空白
书上主:如果一切准备好,运行该服务器程序后,在浏览器中访问localhost:8000可以看到一句“Hello World”。
4、支持HTTPS的文件服务器
代码如下:
package main
import(
"net/http"
)
func main(){
h:=http.FileServer(http.Dir("."))
http.ListenAndServeTLS(":8001","rui.crt","rui.key",h)
}
运行结果如下:空白
测试
单元测试(Unit Testing)又称为模块测试。
一、单元测试
testing是Go语言的一个package,它提供自动化测试功能。通过go test命令能够自动执行如下形式的函数:
func TestXxx(*testing.T)
要编写一个新的测试模块,需要创建一个名称以_test.go结尾的文件,该文件包含TestXxx函数,最后将该文件放在与被测试的包相同的包目录中。
运行go help test和go help testflag可以了解更加详细的信息。
1、第一个单元测试
代码如下:basic.go
package main
import "fmt"
func main() {
fmt.Println(Age(-7))
}
//Age测试
func Age(n int) int {
if n > 0 {
return n
}
n = 0
return n
}
代码如下:basic_test.go
package main
import "testing"
//TestFib测试
func TestFib(t *testing.T) {
var (
input = -100
expected = 0
)
actual := Age(input)
if actual != expected {
t.Errorf("Fib(%d)=%d,预期为 %d", input, actual, expected)
}
}
执行测试命令:
go test .
运行结果:
ok test/test 0.693s
2、表组测试
代码如下:
package main
import "fmt"
func main() {
fmt.Println(isPrime(25))
}
//大于1的自然数中,除了1和它本身以外不再有其它因数的数称为质数
func isPrime(value int) bool {
if value<=3{
return value >=2
}
if value%2==0||value%3==0{
return false
}
for i:=5;i*i<=value;i+=6{
if value%i==0||value%(i+2)==0{
return false
}
}
return true
}
代码如下:
package main
import "testing"
//TestPrime测试
func TestPrime(t *testing.T) {
var primeTests = []struct {
input int
expected bool
}{
{1, false},
{2, true},
{3, true},
{4, false},
{5, true},
{6, false},
{7, false},
}
for _, tt := range primeTests {
actual := isPrime(tt.input)
if actual != tt.expected {
t.Errorf("%d %v %v", tt.input, actual, tt.expected)
}
}
}
执行测试命令:
go test .
运行结果:
--- FAIL: TestPrime (0.00s)
basic_test.go:22: 7 true false
FAIL
FAIL test/test 1.375s
FAIL
3、模拟测试
4、测试覆盖率
go test -v -coverprofile=c.out
go tool cover -html=c.out -o=tag.html
二、基准测试
基准测试(benchmarking)
go test -bench=. -run=none
go test -bench=. -benchtime=3s -run=none
1、性能对比
go test -bench=. -run=none
go test -bench=. -benchmem -run=none
2、pprof