四时宝库

程序员的知识宝库

Go语言圣经第2章实验(圣经第二章主要讲了什么)

编码的实现环境是go1.15.6、LiteIDE X37.3、win7。是《Go语言圣经》的练习及作业,个别代码有修改,仅供交流学习之用。

// Boiling prints the boiling point of water.

package main
import "fmt"
const boilingF = 212.0
func main() {
    var f = boilingF
    var c = (f - 32) * 5 / 9
    fmt.Printf("boiling point = %goF or %goC \n", f, c)
    // Output:
    // boiling point = 212°F or 100°C
}

// Ftoc prints two Fahrenheit-to-Celsius conversions.

package main
import "fmt"
const boilingF = 212.0
func main() {
    const freezingF, boilingF = 32.0, 212.0
    fmt.Printf("%goF = %goC \n", freezingF, fToC(freezingF))
    fmt.Printf("%goC = %goF \n", boilingF, fToC(boilingF))
}
func fToC(f float64) float64 {
    return (f - 32) * 5 / 9
}

// Echo4 prints its command-line arguments.

// 指针是实现标准库中flag包的关键技术,它使用命令行参数来设置对应变量的值。

package main
import (
    "fmt"
    "flag"
    "strings"
)
// 调用flag.Bool函数会创建一个新的对应布尔型标志参数的变量。它有三个属性:
// 第一个是命令行标志参数的名字“n”,然后是该标志参数的默认值(这里是false),最后是该标志参数对应的描述信息。
// 如果用户在命令行输入了一个无效的标志参数,或者输入-h或-help参数,那么将打印所有标志参数的名字、默认值和描述信息。
var n = flag.Bool("n", false, "省略行尾换行符(omit trailing newline)")
var sep = flag.String("s", " ", "分隔符(separator)")   //调用flag.String函数将创建一个对应字符串类型的标志参数变量。
func main() {
    // 当程序运行时,必须在使用标志参数对应的变量之前先调用flag.Parse函数,用于更新每个标志参数对应变量的值(之前是默认值)。
    // 如果在flag.Parse函数解析命令行参数时遇到错误,默认将打印相关的提示信息,然后调用os.Exit(2)终止程序。
    flag.Parse()
    // 对于非标志参数的普通命令行参数可以通过调用flag.Args()函数来访问,返回值对应一个字符串类型的slice。
    fmt.Print(strings.Join(flag.Args(), *sep))  // sep和n变量分别是指向对应命令行标志参数变量的指针
    if !*n {
        fmt.Println()
    }
    var ii int
    var ss string
    var bb bool
    var ff interface{}
    fmt.Printf("整型、字符串型、布尔型、空接口的默认值分别是:", ii, ss, bb, ff)
    // Output:
    // boiling point = 212°F or 100°C
}

// Cf converts its numeric argument to Celsius and Fahrenheit.

// 执行命令:go run cf.go 22

package main
import (
    "fmt"
    "os"
    "strconv"
    "gopl.io/tempconv"
)
func main() {
    for _, arg := range os.Args[1:] {
        t, err := strconv.ParseFloat(arg, 64)
        if err != nil {
            fmt.Fprintf(os.Stderr, "cf: %v\n", err)
            os.Exit(1)
        }
        fmt.Println(t)
        f := tempconv.Fahrenheit(t)
        c := tempconv.Celsius(t)
        fmt.Printf("%s = %s, %s = %s\n", f, tempconv.FToC(f), c, tempconv.CToF(c))
    }
}

// popcount 定义了一个PopCount函数,用于返回一个数字中含二进制1bit的个数。

package main
import (
    "fmt"
)
var pc [256]byte
func init() {
    for i := range pc {
        pc[i] = pc[i/2] + byte(i&1)
    }
    fmt.Println(pc, 6&1)
}
// pc[i] is the population count of i.可代替初始化函数
/*var pc [256]byte func() pc [256]byte {
    for i := range pc {
        pc[i] = pc[i/2] + byte(i&1)
    }
}*/
// PopCount returns the population count (number of set bits) of x.
func PopCount(x int64) int {
    return int(pc[byte(x>>(0*8))] +
        pc[byte(x>>(1*8))] +
        pc[byte(x>>(2*8))] +
        pc[byte(x>>(3*8))] +
        pc[byte(x>>(4*8))] +
        pc[byte(x>>(5*8))] +
        pc[byte(x>>(6*8))] +
        pc[byte(x>>(7*8))])
}
func main() {
    fmt.Println(PopCount(7))
}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接