Неявное преобразование типов

В языке Go отсутствует неявное преобразование типов (implicit type conversion) в том виде, в котором оно присутствует во многих других языках программирования. Это означает, что вы не можете просто так присвоить значение одного типа переменной другого типа или использовать значения разных типов в одной операции без явного приведения. Однако существуют отдельные случаи, где неявное преобразование все же происходит.

Преобразование между числовыми типами

В Go не допускается неявное преобразование между разными числовыми типами. Даже если один тип может вместить значение другого, компилятор потребует явного преобразования:

gopackage main

import "fmt"

func main() {
  var x int32 = 10
  var y int64 = x // Ошибка компиляции
  fmt.Println(y)
}

Для корректной работы необходимо выполнить явное преобразование:

gopackage main

import "fmt"

func main() {
  var x int32 = 10
  var y int64 = int64(x)
  fmt.Println(y)
}

Результат выполнения кода:

go10

Преобразование между целочисленными и числами с плавающей точкой

Аналогичным образом требуется явное преобразование между целыми числами и числами с плавающей точкой:

gopackage main

import "fmt"

func main() {
  var a int = 5
  var b float64 = a // Ошибка компиляции
  fmt.Println(b)
}

Правильный способ преобразования:

gopackage main

import "fmt"

func main() {
  var a int = 5
  var b float64 = float64(a)
  fmt.Println(b)
}

Результат выполнения кода:

go5

Преобразование между строковыми и числовыми типами

В Go также отсутствует неявное преобразование между строковыми и числовыми типами. Для преобразования между string и числовыми типами используются функции из пакета strconv:

gopackage main

import (
  "fmt"
  "strconv"
)

func main() {
  var num int = 123
  str := strconv.Itoa(num)
  fmt.Println(str)
}

Результат выполнения кода:

go"123"

Единственное исключение: преобразование между byte и rune

Единственным случаем неявного преобразования в Go является возможность присвоения значения типа byte переменной типа rune и наоборот, поскольку эти типы являются алиасами для uint8 и int32 соответственно:

gopackage main

import "fmt"

func main() {
  var b byte = 65
  var r rune = b
  fmt.Println(r)
}

Результат выполнения кода:

go65

Сравнение значений разных типов

В Go также запрещено сравнивать значения разных типов, за исключением случаев, когда один из типов может быть преобразован в другой неявно. Это касается типов с одинаковым базовым типом:

gopackage main

import "fmt"

type MyInt int

func main() {
  var x int = 10
  var y MyInt = 10
  fmt.Println(x == y) // Ошибка компиляции
}

Для сравнения необходимо явное преобразование:

gopackage main

import "fmt"

type MyInt int

func main() {
  var x int = 10
  var y MyInt = 10
  fmt.Println(x == int(y))
}

Результат выполнения кода:

gotrue

Смотрите также

  • функцию to-int,
    которая преобразует значение к типу int
  • функцию to-string,
    которая преобразует значение к типу string
  • функцию to-float64,
    которая преобразует значение к типу float64
  • функцию named-types,
    которая описывает преобразование именованных типов