Понимание переполнения при использовании типа Infered Const - PullRequest
0 голосов
/ 17 января 2019

В примере с TourOfGo пишут, что

Нетипизированная константа принимает тип, необходимый ее контексту

Но следующая программа выбрасывает переполнение:

package main

import "fmt"

const  Big  = 1 << 100 // no overflow here 
// var  Big  = 1 << 100  // overflow here 

func main() {
    fmt.Printf("big = %T",Big) // causes overflow error here
}

Это тот случай, когда переполнение происходит только при преобразовании const в переменную?

1 Ответ

0 голосов
/ 18 января 2019

Пока литерал является просто константой (нигде не назначен), его не нужно материализовать, поэтому ошибки нет. Компилятор ждет, когда вы действительно его где-нибудь используете. Учтите это:

package main

import "fmt"

const  Big  = 1 << 100 // no overflow here 
    var f float64
    f = Big
    fmt.Println(f)
}

Это успешно выполняется и выводит разумное приближение 2 ^ 100 (в пределах точности точности чисел с плавающей запятой). Однако, если вы попытаетесь присвоить его переменной, будет выведено значение int (в конце концов, литерал является целым числом), и то же самое верно, когда вы пытаетесь распечатать его тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...