分享
  1. 首页
  2. 文章

go语言程序设计中的一个例子 加注释

zistxym · · 2669 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

// 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
}

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:zistxym

查看原文:go语言程序设计中的一个例子 加注释

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2669 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏