iota w wyrażeniu potęgowania - problem z kompilacją

iota w wyrażeniu potęgowania - problem z kompilacją
Pyxis
  • Rejestracja: dni
  • Ostatnio: dni
0

Ktoś byłby w stanie wyjaśnić skąd się biorą różnice? Po uruchomieniu kodu:

Kopiuj
package main

import (
	"fmt"
	"math"
)

func main() {
	const (
		a = 4020.02839 * iota
		b
		c
	)
	fmt.Printf("type(a) = %t\n", a)
	fmt.Printf("type(b) = %t\n", b)
	fmt.Printf("type(c) = %t\n", c)

	d := math.Pow(2, 3)
	fmt.Printf("type(d) = %t\n", d)
}

Otrzymujemy output:

Kopiuj
type(a) = %!t(float64=0)
type(b) = %!t(float64=4020.02839)
type(c) = %!t(float64=8040.05678)
type(d) = %!t(float64=8)

Natomiast jak się użyje potęgowania wraz z iota, to dostajemy błąd kompilacji:

Kopiuj
package main

import (
	"fmt"
	"math"
)

func main() {
	const (
		a = math.Pow(2, iota)
		b
		c
	)
	fmt.Printf("type(a) = %t\n", a)
	fmt.Printf("type(b) = %t\n", b)
	fmt.Printf("type(c) = %t\n", c)
}

Szczerze mówiąc ten błąd mi niewiele pomaga:

Kopiuj
# command-line-arguments
./const_bytes.go:10:7: math.Pow(2, iota) (value of type float64) is not constant
./const_bytes.go:11:3: math.Pow(2, iota) (value of type float64) is not constant
./const_bytes.go:12:3: math.Pow(2, iota) (value of type float64) is not constant

Wcześniej również mieliśmy float64 jako constant i działało.

LukeJL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8488
1

No ja to rozumiem tak, że jak masz 4020.02839 * iota, to kompilator może sobie wynik obliczyć na etapie kompilacji. Więc traktuje to jako stałą.

A jak masz math.Pow(2, iota) to wywołujesz funkcję, więc kompilator tego nie może obliczyć bez uruchamiania programu. Więc nie może tego skompilować, bo nie wiadomo, co tam jest.

Przynajmniej tak wnioskuję z tego komunikatu błędu (value of type float64) is not constant.

Z drugiej strony aż tak szczegółowo Go nie znam, może jednak jakoś się da zrobić to, co chcesz zrobić? Nie wiem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.