Почему число типа float64, вызывающее ошибку типа int в Go - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь понять Голанг, в одном из примеров учебника говорится, что An untyped constant takes the type needed by its context.

package main

import "fmt"

const (
    // Create a huge number by shifting a 1 bit left 100 places.
    // In other words, the binary number that is 1 followed by 100 zeroes.
    Big = 1 << 100
    // Shift it right again 99 places, so we end up with 1<<1, or 2.
    Small = Big >> 99
)

func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
    return x * 0.1
}

func main() {
    fmt.Println(needInt(Small))
    fmt.Println(needFloat(Small))

    // Here Big is too large of a number but can be handled as a float64.
    // No compilation error is thrown here.
    fmt.Println(needFloat(Big))

    // The below line throws the following compilation error
    // constant 1267650600228229401496703205376 overflows int
    fmt.Println(Big)
}

При вызове fmt.Println(Big) почему Голанг рассматривает Big как int, где какпо контексту должно быть float64?

Чего мне не хватает?

Ответы [ 2 ]

4 голосов
/ 07 июня 2019

Каков контекст для fmt.Println? Другими словами, что fmt.Println ожидает от Big? interface{}.

С Блог Go о константах :

Что происходит, когда fmt.Printf вызывается с нетипизированной константой, так это то, что значение интерфейса создается для передачи в качестве аргумента, а конкретный тип, хранимый для этого аргумента, является типом константы по умолчанию.

Таким образом, тип константы по умолчанию должен быть int. Страница продолжает говорить о том, как значения по умолчанию определяются на основе синтаксиса, а не обязательно значения const.

0 голосов
/ 08 июня 2019

Big в fmt.Println(Big) имеет тип integer, превышающий значение max int 9223372036854775807

, вы можете найти max int из этой логики

const MaxUint = ^uint(0)
const MaxInt = int(MaxUint >> 1)
fmt.Println(MaxInt) // print 922337

2036854775807

Чтобы исправить это, вам нужно привести его к float64 следующим образом

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