Go
Константы
Поиск…
замечания
Go поддерживает константы символов, строковых, логических и числовых значений.
Объявление константы
Константы объявляются как переменные, но с использованием ключевого слова const
:
const Greeting string = "Hello World"
const Years int = 10
const Truth bool = true
Как и для переменных, имена, начинающиеся с буквы верхнего регистра, экспортируются ( общедоступны ), имена, начинающиеся с нижнего регистра, не являются.
// not exported
const alpha string = "Alpha"
// exported
const Beta string = "Beta"
Константы могут использоваться как любая другая переменная, за исключением того факта, что значение не может быть изменено. Вот пример:
package main
import (
"fmt"
"math"
)
const s string = "constant"
func main() {
fmt.Println(s) // constant
// A `const` statement can appear anywhere a `var` statement can.
const n = 10
fmt.Println(n) // 10
fmt.Printf("n=%d is of type %T\n", n, n) // n=10 is of type int
const m float64 = 4.3
fmt.Println(m) // 4.3
// An untyped constant takes the type needed by its context.
// For example, here `math.Sin` expects a `float64`.
const x = 10
fmt.Println(math.Sin(x)) // -0.5440211108893699
}
Объявление нескольких констант
Вы можете объявить несколько констант в одном и том же блоке const
:
const (
Alpha = "alpha"
Beta = "beta"
Gamma = "gamma"
)
И автоматически увеличивайте константы с помощью ключевого слова iota
:
const (
Zero = iota // Zero == 0
One // One == 1
Two // Two == 2
)
Дополнительные примеры использования iota
для объявления констант см. В разделе Iota .
Вы также можете объявить несколько констант, используя множественное присвоение. Однако этот синтаксис может быть труднее прочитать, и его обычно избегают.
const Foo, Bar = "foo", "bar"
Типированные или нетипизированные константы
Константы в Go могут быть напечатаны или неттипированы. Например, с учетом следующего строкового литерала:
"bar"
можно сказать, что тип литерала - это string
, однако это не является семантически правильным. Вместо этого, литералы являются Untyped строковыми константами . Это строка (вернее, ее тип по умолчанию - string
), но она не является значением Go и поэтому не имеет типа, пока она не будет назначена или не будет использована в заданном контексте. Это тонкое различие, но полезно понять.
Аналогично, если мы присваиваем литерал константе:
const foo = "bar"
Он остается нетипизированным, поскольку по умолчанию константы являются нетипизированными. Можно также объявить его как типизированную строковую константу :
const typedFoo string = "bar"
Разница вступает в игру, когда мы пытаемся назначить эти константы в контексте, который имеет тип. Например, рассмотрим следующее:
var s string
s = foo // This works just fine
s = typedFoo // As does this
type MyString string
var mys MyString
mys = foo // This works just fine
mys = typedFoo // cannot use typedFoo (type string) as type MyString in assignment