黑马程序员技术交流社区

标题: 【上海校区】Go语言基础学习五-一些数值操作的简单例子 [打印本页]

作者: 不二晨    时间: 2018-12-18 16:58
标题: 【上海校区】Go语言基础学习五-一些数值操作的简单例子
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    = `<!DOCTYPE HTML><html><head>

<style>.error{color:#FF0000;}</style></head><title>Statistics</title>

<body><h3>Statistics</h3>

<p>Computes basic statistics for a given list of numbers</p>`

    form       = `<form action="/" method="POST">

<label for="numbers">Numbers (comma or space-separated):</label><br />

<input type="text" name="numbers" size="30"><br />

<input type="submit" value="Calculate">

</form>`

    pageBottom = `</body></html>`

    anError    = `<p class="error">%s</p>`//用于格式化输出

)

接下来分析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

}
---------------------
【转载】仅作分享,侵删
作者:三旬老汉
原文:https://blog.csdn.net/qq_21898173/article/details/67637671



作者: 不二晨    时间: 2018-12-18 17:55
奈斯
作者: 梦缠绕的时候    时间: 2018-12-20 16:42





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2