Go中的类型和减法

时间:2013-08-07 23:26:33

标签: go

我是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"},
}

2 个答案:

答案 0 :(得分:6)

'0'是一个字符,不等于0'0'实际上是符文文字,由单个字符(字节)组成,等于48stringOfDigits[column]byte

使用单个字符时,它会与ASCII table匹配。

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

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

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

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

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

答案 1 :(得分:6)

'0'符文文字,其值为48specification says

  

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

Literal符文也是无类型常量:

  

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

     

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

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

digit := stringOfDigits[column] - '0'

常量'0'和结果变量digit将从表达式stringOfDigits[column]中隐式获取其类型,其类型为byte别名 of uint8)因为stringOfDigitsstring

digit成为byte(2)的唯一方法是stringOfDigit[column]byte(50),也可拼写为byte('2')

这就是50 - '0'成为2的方式。