go语言程序设计中的一个例子 加注释
来源:互联网 发布:中国主席怎么选举 知乎 编辑:程序博客网 时间:2024/05/29 14:01
// Copyright 漏 2010-12 Qtrac Ltd.
//
// This program or package and any associated files are licensed under the
// Apache License, Version 2.0 (the "License"); you may not use these files
// except in compliance with the License. You can get a copy of the License
// at: http://www.apache.org/licenses/LICENSE-2.0.
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"fmt"
"log"
"net/http"
"sort"
"strconv"
"strings"
)
const (
//以下的常量定义,其实是根据一个html来定义的
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>`
//引用了error定义的风格
anError = `<p class="error">%s</p>`
)
type statistics struct {
numbers []float64
mean float64
median float64
}
func main() {
http.HandleFunc("/", homePage)
if err := http.ListenAndServe(":9001", nil); err != nil {
log.Fatal("failed to start server", err)
}
}
func homePage(writer http.ResponseWriter, request *http.Request) {
err := request.ParseForm() // Must be called before writing response
fmt.Fprint(writer, pageTop, form) // 行头
//如果出错,则会在打印出错误信息
if err != nil {
fmt.Fprintf(writer, anError, err)
} else {
if numbers, message, ok := processRequest(request); ok {
stats := getStats(numbers) //取得排序后和计算好的数据
fmt.Fprint(writer, formatStats(stats)) // 格式化后数据输出
} else if message != "" {
fmt.Fprintf(writer, anError, message)
}
}
fmt.Fprint(writer, pageBottom) //行尾
}
func processRequest(request *http.Request) ([]float64, string, bool) {
var numbers []float64 //定义成切片
if slice, found := request.Form["numbers"]; found && len(slice) > 0 { //取得number项
text := strings.Replace(slice[0], ",", " ", -1) // slice[0] ?
for _, field := range strings.Fields(text) {
if x, err := strconv.ParseFloat(field, 64); err != nil { //转换成浮点数
return numbers, "'" + field + "' is invalid", false
} else {
numbers = append(numbers, x) //用内置函数append追加到切片中
}
}
}
if len(numbers) == 0 {
return numbers, "", false // no data first time form is shown
}
return numbers, "", true
}
func formatStats(stats statistics) string {
//格式化输出
return fmt.Sprintf(`<table border="1">
<tr><th colspan="2">Results</th></tr>
<tr><td>Numbers</td><td>%v</td></tr>
<tr><td>Count</td><td>%d</td></tr>
<tr><td>Mean</td><td>%f</td></tr>
<tr><td>Median</td><td>%f</td></tr>
</table>`, stats.numbers, len(stats.numbers), stats.mean, stats.median)
}
func getStats(numbers []float64) (stats statistics) {
stats.numbers = numbers // go语言中的 返回值技巧
sort.Float64s(stats.numbers) //排序包
stats.mean = sum(numbers) / float64(len(numbers)) //平均值时,先转换成float64,不然有可以是整数相除,取整了
stats.median = median(numbers)
return stats
}
func sum(numbers []float64) (total float64) {
for _, x := range numbers {
total += x
}
return total
}
func median(numbers []float64) float64 {
middle := len(numbers) / 2
result := numbers[middle]
if len(numbers)%2 == 0 {
result = (result + numbers[middle-1]) / 2
}
return result
}
- go语言程序设计中的一个例子 加注释
- JXTA的一个例子[加了注释]
- JXTA的一个例子[加了注释]
- 一个mapreduce实例加注释
- 一个自定义注释的例子
- 一个自定义注释的例子
- Go语言程序设计:集合类型
- c 语言 逆波兰计算器 C语言程序设计中的例子
- go语言 输出一个数字的例子
- 自动加注释和除去注释的一个命令
- 加了***的所有例子都出自(Java语言程序设计),P n表示多少页。
- jad简单用法 最后有简单的例子加注释
- java 连接Oracle数据库简单例子源码加注释
- 一个搜索路径的例子程序 注释
- 一个xdoclet技术,注释的例子
- 一个不错的加解密代码例子
- C 语言程序设计 例子-素数
- 《go语言程序设计》第九章练习
- android ContentProvider入门使用
- poj 2181 Jumping Cows
- CentOS 6.2安装第三方软件库epel
- spring security2【与数据库权限关联】
- Android音频系统之AudioFlinger(二)
- go语言程序设计中的一个例子 加注释
- php文件无法写入之原因
- firefox(火狐)使用自动填充记住的用户名密码时,会将密码填充到相同name的文本域解决办法
- JMX简介(二)
- VC内存泄露检查工具:VisualLeakDetector
- 802.11 n关键技术
- AS3.0下Loader与URLLoader的比较
- PHP判断两个网址是否指向相同的网页
- 单一责任原则