2

我是 Go 编程语言的初学者,我对这个示例程序很感兴趣。

通过 $ go run <filename>.go 1(或任何其他整数)执行程序

我的问题如下:

请关注程序中的以下行

digit := stringOfDigits[column] - '0'

如果我跑

fmt.Println(stringOfDigits[column])

这返回 50


如果我跑

fmt.Println(digit)

这返回 2

那么,50 - '0' 如何等于 2?

为什么stringOfDigits[column]返回 50?比如50是怎么进去的?

还有,“0”和“0”有什么区别,引号重要吗?

在程序中,“0”将运行,“0”将中断程序

代码块:

package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
)

func main() {
    if len(os.Args) == 1 {
        fmt.Printf("usage: %s <whole-number>\n", filepath.Base(os.Args[0]))
        os.Exit(1)
    }

    stringOfDigits := os.Args[1]
    for row := range bigDigits[0] {
        line := ""
        for column := range stringOfDigits {
            digit := stringOfDigits[column] - '0'
            if 0 <= digit && digit <= 9 {
                line += bigDigits[digit][row] + "  "
            } else {
                log.Fatal("invalid whole number")
            }
        }
        fmt.Println(line)
    }
}

var bigDigits = [][]string{
    {"  000  ",
     " 0   0 ",
     "0     0",
     "0     0",
     "0     0",
     " 0   0 ",
     "  000  "},
    {" 1 ", "11 ", " 1 ", " 1 ", " 1 ", " 1 ", "111"},
    {" 222 ", "2   2", "   2 ", "  2  ", " 2   ", "2    ", "22222"},
    {" 333 ", "3   3", "    3", "  33 ", "    3", "3   3", " 333 "},
    {"   4  ", "  44  ", " 4 4  ", "4  4  ", "444444", "   4  ",
        "   4  "},
    {"55555", "5    ", "5    ", " 555 ", "    5", "5   5", " 555 "},
    {" 666 ", "6    ", "6    ", "6666 ", "6   6", "6   6", " 666 "},
    {"77777", "    7", "   7 ", "  7  ", " 7   ", "7    ", "7    "},
    {" 888 ", "8   8", "8   8", " 888 ", "8   8", "8   8", " 888 "},
    {" 9999", "9   9", "9   9", " 9999", "    9", "    9", "    9"},
}
4

2 回答 2

7

'0'是具有 value的符文文字48规范说:

符文文字表示符文常量,一个标识 Unicode 代码点的整数值。符文文字表示为一个或多个用单引号括起来的字符。

文字符文也是无类型常量:

常量可以有类型或无类型。文字常量、true、false、iota 和某些仅包含无类型常量操作数的常量表达式是无类型的。

常量可以通过常量声明或转换显式地赋予类型,或者在用于变量声明或赋值或作为表达式中的操作数时隐式赋予。

这意味着在这个表达式中:

digit := stringOfDigits[column] - '0'

常量'0'和结果变量digit都将从表达式stringOfDigits[column]中隐式获取它们的类型,表达式具有类型byte(的别名) ,uint8因为stringOfDigits是 a string

digitto be的唯一方式byte(2)是 for stringOfDigit[column]to be byte(50),也可以拼写为byte('2')

就这样50 - '0'变成了2

于 2013-08-22T21:35:55.600 回答
6

该值'0'是一个字符并且不相等0'0'实际上是一个符文文字,它由一个等于 . 的单个字符(字节)组成48stringOfDigits[column]是一个byte

使用单个字符时,它将与ASCII 表匹配。

为了获得正确的结果,您可以从每个字节值中减去 48,假设您只使用个位数的 0-9:

stringOfDigits[column] - 48 - ('0' - 48)

我假设你想忽略空格。空格等于 32,因此您可以执行以下条件:

if stringOfDigits[column] == 32 { // Same thing: == ' '
    continue;
}

或者,您可以使用strconv包来转换大于 9 的数字。

于 2013-08-08T03:27:15.573 回答