Involved Source Fileskind_string.go Package constant implements Values representing untyped
Go constants and their corresponding operations.
A special Unknown value may be used when a value
is unknown due to an error. Operations on unknown
values produce unknown values unless specified
otherwise.
Code Examples
package main
import (
"fmt"
"go/constant"
"go/token"
)
func main() {
// 11 / 0.5
a := constant.MakeUint64(11)
b := constant.MakeFloat64(0.5)
c := constant.BinaryOp(a, token.QUO, b)
fmt.Println(c)
}
package main
import (
"fmt"
"go/constant"
"go/token"
"slices"
)
func main() {
vs := []constant.Value{
constant.MakeString("Z"),
constant.MakeString("bacon"),
constant.MakeString("go"),
constant.MakeString("Frame"),
constant.MakeString("defer"),
constant.MakeFromLiteral(`"a"`, token.STRING, 0),
}
slices.SortFunc(vs, func(a, b constant.Value) int {
if constant.Compare(a, token.LSS, b) {
return -1
}
if constant.Compare(a, token.GTR, b) {
return +1
}
return 0
})
for _, v := range vs {
fmt.Println(constant.StringVal(v))
}
}
package main
import (
"fmt"
"go/constant"
"go/token"
)
func main() {
zero := constant.MakeInt64(0)
one := constant.MakeInt64(1)
negOne := constant.MakeInt64(-1)
mkComplex := func(a, b constant.Value) constant.Value {
b = constant.MakeImag(b)
return constant.BinaryOp(a, token.ADD, b)
}
vs := []constant.Value{
negOne,
mkComplex(zero, negOne),
mkComplex(one, negOne),
mkComplex(negOne, one),
mkComplex(negOne, negOne),
zero,
mkComplex(zero, zero),
one,
mkComplex(zero, one),
mkComplex(one, one),
}
for _, v := range vs {
fmt.Printf("% d %s\n", constant.Sign(v), v)
}
}
package main
import (
"fmt"
"go/constant"
"go/token"
)
func main() {
vs := []constant.Value{
constant.MakeBool(true),
constant.MakeFloat64(2.7),
constant.MakeUint64(42),
}
for i, v := range vs {
switch v.Kind() {
case constant.Bool:
vs[i] = constant.UnaryOp(token.NOT, v, 0)
case constant.Float:
vs[i] = constant.UnaryOp(token.SUB, v, 0)
case constant.Int:
// Use 16-bit precision.
// This would be equivalent to ^uint16(v).
vs[i] = constant.UnaryOp(token.XOR, v, 16)
}
}
for _, v := range vs {
fmt.Println(v)
}
}
package main
import (
"fmt"
"go/constant"
"math"
)
func main() {
maxint := constant.MakeInt64(math.MaxInt64)
fmt.Printf("%v\n", constant.Val(maxint))
e := constant.MakeFloat64(math.E)
fmt.Printf("%v\n", constant.Val(e))
b := constant.MakeBool(true)
fmt.Printf("%v\n", constant.Val(b))
b = constant.Make(false)
fmt.Printf("%v\n", constant.Val(b))
}
package main
import (
"fmt"
"go/constant"
"go/token"
)
func main() {
// Create the complex number 2.3 + 5i.
ar := constant.MakeFloat64(2.3)
ai := constant.MakeImag(constant.MakeInt64(5))
a := constant.BinaryOp(ar, token.ADD, ai)
// Compute (2.3 + 5i) * 11.
b := constant.MakeUint64(11)
c := constant.BinaryOp(a, token.MUL, b)
// Convert c into a complex128.
Ar, exact := constant.Float64Val(constant.Real(c))
if !exact {
fmt.Printf("Could not represent real part %s exactly as float64\n", constant.Real(c))
}
Ai, exact := constant.Float64Val(constant.Imag(c))
if !exact {
fmt.Printf("Could not represent imaginary part %s as exactly as float64\n", constant.Imag(c))
}
C := complex(Ar, Ai)
fmt.Println("literal", 25.3+55i)
fmt.Println("go/constant", c)
fmt.Println("complex128", C)
}
BinaryOp returns the result of the binary expression x op y.
The operation must be defined for the operands. If one of the
operands is [Unknown], the result is [Unknown].
BinaryOp doesn't handle comparisons or shifts; use [Compare]
or [Shift] instead.
To force integer division of [Int] operands, use op == [token.QUO_ASSIGN]
instead of [token.QUO]; the result is guaranteed to be [Int] in this case.
Division by zero leads to a run-time panic.
BitLen returns the number of bits required to represent
the absolute value x in binary representation; x must be an [Int] or an [Unknown].
If x is [Unknown], the result is 0.
BoolVal returns the Go boolean value of x, which must be a [Bool] or an [Unknown].
If x is [Unknown], the result is false.
Bytes returns the bytes for the absolute value of x in little-
endian binary representation; x must be an [Int].
Compare returns the result of the comparison x op y.
The comparison must be defined for the operands.
If one of the operands is [Unknown], the result is
false.
Denom returns the denominator of x; x must be [Int], [Float], or [Unknown].
If x is [Unknown], or if it is too large or small to represent as a
fraction, the result is [Unknown]. Otherwise the result is an [Int] >= 1.
Float32Val is like [Float64Val] but for float32 instead of float64.
Float64Val returns the nearest Go float64 value of x and whether the result is exact;
x must be numeric or an [Unknown], but not [Complex]. For values too small (too close to 0)
to represent as float64, [Float64Val] silently underflows to 0. The result sign always
matches the sign of x, even for 0.
If x is [Unknown], the result is (0, false).
Imag returns the imaginary part of x, which must be a numeric or unknown value.
If x is [Unknown], the result is [Unknown].
Int64Val returns the Go int64 value of x and whether the result is exact;
x must be an [Int] or an [Unknown]. If the result is not exact, its value is undefined.
If x is [Unknown], the result is (0, false).
Make returns the [Value] for x.
type of x result Kind
----------------------------
bool Bool
string String
int64 Int
*big.Int Int
*big.Float Float
*big.Rat Float
anything else Unknown
MakeFloat64 returns the [Float] value for x.
If x is -0.0, the result is 0.0.
If x is not finite, the result is an [Unknown].
MakeFromBytes returns the [Int] value given the bytes of its little-endian
binary representation. An empty byte slice argument represents 0.
MakeFromLiteral returns the corresponding integer, floating-point,
imaginary, character, or string value for a Go literal string. The
tok value must be one of [token.INT], [token.FLOAT], [token.IMAG],
[token.CHAR], or [token.STRING]. The final argument must be zero.
If the literal string syntax is invalid, the result is an [Unknown].
Num returns the numerator of x; x must be [Int], [Float], or [Unknown].
If x is [Unknown], or if it is too large or small to represent as a
fraction, the result is [Unknown]. Otherwise the result is an [Int]
with the same sign as x.
Real returns the real part of x, which must be a numeric or unknown value.
If x is [Unknown], the result is [Unknown].
Sign returns -1, 0, or 1 depending on whether x < 0, x == 0, or x > 0;
x must be numeric or [Unknown]. For complex values x, the sign is 0 if x == 0,
otherwise it is != 0. If x is [Unknown], the result is 1.
StringVal returns the Go string value of x, which must be a [String] or an [Unknown].
If x is [Unknown], the result is "".
ToComplex converts x to a [Complex] value if x is representable as a [Complex].
Otherwise it returns an [Unknown].
ToFloat converts x to a [Float] value if x is representable as a [Float].
Otherwise it returns an [Unknown].
ToInt converts x to an [Int] value if x is representable as an [Int].
Otherwise it returns an [Unknown].
Uint64Val returns the Go uint64 value of x and whether the result is exact;
x must be an [Int] or an [Unknown]. If the result is not exact, its value is undefined.
If x is [Unknown], the result is (0, false).
UnaryOp returns the result of the unary expression op y.
The operation must be defined for the operand.
If prec > 0 it specifies the ^ (xor) result size in bits.
If y is [Unknown], the result is [Unknown].
Val returns the underlying value for a given constant. Since it returns an
interface, it is up to the caller to type assert the result to the expected
type. The possible dynamic return types are:
x Kind type of result
-----------------------------------------
Bool bool
String string
Int int64 or *big.Int
Float *big.Float or *big.Rat
everything else nil
The pages are generated with Goldsv0.7.0-preview. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds.