Go语言基础学习5-一些数值操作的简单例子
实现一个网页,在网页上具有数值统计的功能。该数值统计的功能主要是1.将切片排序 2.计算切片的平均数 3.计算切片的中位数
我们先大致知道这个例子我们需要学到的知识如下:
1.如何创建一个简单的服务器,访问路径时如何调用函数。//入口
2.如何解析网页的请求和输入数据。//请求
3.如何直接向网页写入html操作页面,响应返回。//响应
4.处理数值的一些操作:格式化输入输出,字符串替换,字符串到数值的转换,根据空格将字符串转换为切片,切片内数据的添加,切片排序操作,结构体的使用,for range的使用
step1:定义统计结果结构体
type statistics struct{
numbers []float64
mean float64
median float64
}
step2:定义统计函数
function getStats(numbers []float64) (stat statistics){
//先将number进行排序
stat.numbers = numbers
sort.Float64s(stat.numbers)//调用sort包排序函数
//计算切片平均数,这里切片长度需要转化成float64类型以便运算
stat.mean = sum(numbers)/float64(len(numbers))
//计算切片中位数,sum,median均为实现函数,这里就不贴相关代码了
stat.median = median(numbers)
}
接下来进入到web页面的实现,实现一个简单的http服务器。
主函数如下:
fun main(){
http.HandleFunc(“/”,homepage)//该函数有两个参数,一个是路径,一个是当这个路径被请求时会被执行的函数的引用,这个函数的签名必须是func(http.Response,*http.Request)我们可以注册多个路径-函数对,这里我们只注册了”/”(通常为主页)
if err:=http.ListenAdServe(“:9001”.nil);err!=nill{
//http.ListenAndServe()函数使用给定的Tcp地址启动一个web服务器。这里我们使用localhost:9001(只给端口不给网络地址默认为 localhost),第二个参数表示支持自定义服务器,为空则表示使用默认类型
log.Fatal(“failed to start server”,err )
}
}
部分常量值
const (
pageTop = `
Statistics
Computes basic statistics for a given list of numbers
form = `
`
pageBottom = ``
anError = ` %s
)
接下来分析homePage()函数,这个函数在“/”路径被访问时会被调用
//homePage的签名形式必须如下func(http.Response,*http.Request)
func homePage(writer http.ResponseWriter, request *http.Request) {
//第一步解析表单,在写响应内容前调用
err := request.ParseForm() // Must be called before writing response
//分析完表单后,将pageTop和form两个字符串写入客户端,
fmt.Fprint(writer, pageTop, form)
//若分析表单失败,写入错误信息anError,err是被格式化的值
if err != nil {
fmt.Fprintf(writer, anError, err)
} else {
//分析表单成功后,则processRequest函数解析请求数据,将输入转化为切片格式
if numbers, message, ok := processRequest(request); ok {
//转换切片成功后,调用getStat进行统计运算,将运算后的结果stat转换成格式化的html字符串写入客户端
stats := getStats(numbers)
fmt.Fprint(writer, formatStats(stats))
} else if message != "" {
//转换切片失败则输出错误信息
fmt.Fprintf(writer, anError, message)
//fmt.Fprintf(writer,format,value)属于格式化输出,将value以format格式输出
}
}
fmt.Fprint(writer, pageBottom)
}
//这里就是请求数据处理的部分
func processRequest(request *http.Request) ([]float64, string, bool) {
var numbers []float64
//首先获取请求表单中标签名为numbers的输入
if slice, found := request.Form["numbers"]; found && len(slice) > 0 {
//标签存在并且输入不为空则将改输入字符串中所有逗号替换为空格,-1(替换次数)表示替换所有
text := strings.Replace(slice[0], ",", " ", -1)
for _, field := range strings.Fields(text) {
//将替换后的字符串text根据空格转换成切片并遍历切片数据,将切片中的每个数据转换成float64位
if x, err := strconv.ParseFloat(field, 64); err != nil {
return numbers, "'" + field + "' is invalid", false
} else {
//将float64数值添加到numbers切片中返回
numbers = append(numbers, x)
}
}
}
if len(numbers) == 0 {
return numbers, "", false // no data first time form is shown
}
return numbers, "", true
}