我是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"},
}
答案 0 :(得分:6)
值'0'
是一个字符,不等于0
。 '0'
实际上是符文文字,由单个字符(字节)组成,等于48
。 stringOfDigits[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'
是符文文字,其值为48
。 specification says:
符文字面表示一个符文常量,一个标识Unicode代码点的整数值。符文文字表示为用单引号括起来的一个或多个字符。
Literal符文也是无类型常量:
常量可以是键入的或非类型的。文字常量,true,false,iota和某些仅包含无类型常量操作数的常量表达式是无类型的。
常量可以通过常量声明或转换显式赋予类型,或者在变量声明或赋值中使用时隐式赋值,或者作为表达式中的操作数使用。
这意味着在这个表达式中:
digit := stringOfDigits[column] - '0'
常量'0'
和结果变量digit
将从表达式stringOfDigits[column]
中隐式获取其类型,其类型为byte
(别名 of uint8
)因为stringOfDigits
是string
。
digit
成为byte(2)
的唯一方法是stringOfDigit[column]
为byte(50)
,也可拼写为byte('2')
。
这就是50 - '0'
成为2
的方式。