Неявное преобразование типов
В языке Go отсутствует неявное преобразование типов (implicit type conversion) в том виде, в котором оно присутствует во многих других языках программирования. Это означает, что вы не можете просто так присвоить значение одного типа переменной другого типа или использовать значения разных типов в одной операции без явного приведения. Однако существуют отдельные случаи, где неявное преобразование все же происходит.
Преобразование между числовыми типами
В Go не допускается неявное преобразование между разными числовыми типами. Даже если один тип может вместить значение другого, компилятор потребует явного преобразования:
package main
import "fmt"
func main() {
var x int32 = 10
var y int64 = x // Ошибка компиляции
fmt.Println(y)
}
Для корректной работы необходимо выполнить явное преобразование:
package main
import "fmt"
func main() {
var x int32 = 10
var y int64 = int64(x)
fmt.Println(y)
}
Результат выполнения кода:
10
Преобразование между целочисленными и числами с плавающей точкой
Аналогичным образом требуется явное преобразование между целыми числами и числами с плавающей точкой:
package main
import "fmt"
func main() {
var a int = 5
var b float64 = a // Ошибка компиляции
fmt.Println(b)
}
Правильный способ преобразования:
package main
import "fmt"
func main() {
var a int = 5
var b float64 = float64(a)
fmt.Println(b)
}
Результат выполнения кода:
5
Преобразование между строковыми и числовыми типами
В Go также отсутствует неявное преобразование между строковыми и числовыми типами. Для преобразования между string и числовыми типами используются функции из пакета strconv:
package main
import (
"fmt"
"strconv"
)
func main() {
var num int = 123
str := strconv.Itoa(num)
fmt.Println(str)
}
Результат выполнения кода:
"123"
Единственное исключение: преобразование между byte и rune
Единственным случаем неявного преобразования в Go является возможность присвоения значения типа byte переменной типа rune и наоборот, поскольку эти типы являются алиасами для uint8 и int32 соответственно:
package main
import "fmt"
func main() {
var b byte = 65
var r rune = b
fmt.Println(r)
}
Результат выполнения кода:
65
Сравнение значений разных типов
В Go также запрещено сравнивать значения разных типов, за исключением случаев, когда один из типов может быть преобразован в другой неявно. Это касается типов с одинаковым базовым типом:
package main
import "fmt"
type MyInt int
func main() {
var x int = 10
var y MyInt = 10
fmt.Println(x == y) // Ошибка компиляции
}
Для сравнения необходимо явное преобразование:
package main
import "fmt"
type MyInt int
func main() {
var x int = 10
var y MyInt = 10
fmt.Println(x == int(y))
}
Результат выполнения кода:
true
Смотрите также
-
функцию
to-int,
которая преобразует значение к типу int -
функцию
to-string,
которая преобразует значение к типу string -
функцию
to-float64,
которая преобразует значение к типу float64 -
функцию
named-types,
которая описывает преобразование именованных типов