Golang: Преобразование типов
В языке Go преобразование типов всегда выполняется явно. Это означает, что нельзя просто сложить int и float64, или передать int в функцию, ожидающую string. Явное преобразование требуется везде, где участвуют разные типы.
Преобразование между числовыми типами
var a int = 10
var b float64 = float64(a)Преобразование int в float64. Без него компилятор выдаст ошибку:
var a int = 10
var b float64 = a // ошибка: нельзя неявно преобразовать int в float64Преобразование float64 в int
var f float64 = 3.9
var i int = int(f)
fmt.Println(i) // => 3Преобразование отбрасывает дробную часть.
Преобразование int в string
Чтобы получить строковое представление числа, используется strconv.Itoa():
import "strconv"
var n int = 65
fmt.Println(strconv.Itoa(n)) // => "65"Преобразование string в int
import "strconv"
var s string = "42"
n, err := strconv.Atoi(s)
fmt.Println(n) // => 42Строку нельзя просто привести к числу. Используется strconv.Atoi(), потому что строка может содержать любое значение, не обязательно число.
Преобразование bool
bool не может быть приведён ни к числу, ни к строке напрямую.
var flag bool = true
// var x int = int(flag) // ошибка: нельзя преобразовать bool в int
// var s string = string(flag) // ошибка: нельзя преобразовать bool в stringДля строк используется fmt.Sprintf():
import "fmt"
var flag bool = true
s := fmt.Sprintf("%v", flag)
fmt.Println(s) // "true"Ошибки при несовместимых типах
Go не делает неявных преобразований между несовместимыми типами:
var x int = 10
var y uint = uint(x) // допустимо: явное преобразование
// Компилятор выдаст предупреждение
// conversion from int to string yields a string of one rune, not a string of digits
var z string = string(x)
fmt.Println(z) // символ с кодом 10, а не "10"
fmt.Println(y)Задание
Создайте функцию BuildProfile(name string, age int, rating float64) string, которая возвращает строку профиля пользователя в формате:
"Name: <name>, Age: <age>, Rating: <rating>"Примеры
fmt.Println(BuildProfile("Alice", 30, 4.73))
// => "Name: Alice, Age: 30, Rating: 4.7"
fmt.Println(BuildProfile("Bob", 25, 5))
// => "Name: Bob, Age: 25, Rating: 5.0"Полезное
Пакет strconv реализует преобразования в строковые представления основных типов данных и обратно.
Golang: Преобразование типов
В языке Go преобразование типов всегда выполняется явно. Это означает, что нельзя просто сложить int и float64, или передать int в функцию, ожидающую string. Явное преобразование требуется везде, где участвуют разные типы.
Преобразование между числовыми типами
var a int = 10
var b float64 = float64(a)Преобразование int в float64. Без него компилятор выдаст ошибку:
var a int = 10
var b float64 = a // ошибка: нельзя неявно преобразовать int в float64Преобразование float64 в int
var f float64 = 3.9
var i int = int(f)
fmt.Println(i) // => 3Преобразование отбрасывает дробную часть.
Преобразование int в string
Чтобы получить строковое представление числа, используется strconv.Itoa():
import "strconv"
var n int = 65
fmt.Println(strconv.Itoa(n)) // => "65"Преобразование string в int
import "strconv"
var s string = "42"
n, err := strconv.Atoi(s)
fmt.Println(n) // => 42Строку нельзя просто привести к числу. Используется strconv.Atoi(), потому что строка может содержать любое значение, не обязательно число.
Преобразование bool
bool не может быть приведён ни к числу, ни к строке напрямую.
var flag bool = true
// var x int = int(flag) // ошибка: нельзя преобразовать bool в int
// var s string = string(flag) // ошибка: нельзя преобразовать bool в stringДля строк используется fmt.Sprintf():
import "fmt"
var flag bool = true
s := fmt.Sprintf("%v", flag)
fmt.Println(s) // "true"Ошибки при несовместимых типах
Go не делает неявных преобразований между несовместимыми типами:
var x int = 10
var y uint = uint(x) // допустимо: явное преобразование
// Компилятор выдаст предупреждение
// conversion from int to string yields a string of one rune, not a string of digits
var z string = string(x)
fmt.Println(z) // символ с кодом 10, а не "10"
fmt.Println(y)Задание
Создайте функцию BuildProfile(name string, age int, rating float64) string, которая возвращает строку профиля пользователя в формате:
"Name: <name>, Age: <age>, Rating: <rating>"Примеры
fmt.Println(BuildProfile("Alice", 30, 4.73))
// => "Name: Alice, Age: 30, Rating: 4.7"
fmt.Println(BuildProfile("Bob", 25, 5))
// => "Name: Bob, Age: 25, Rating: 5.0"Полезное
Пакет strconv реализует преобразования в строковые представления основных типов данных и обратно.
Ваше упражнение проверяется по этим тестам
package solution
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestBuildProfile(t *testing.T) {
tests := []struct {
name string
age int
rating float64
expected string
}{
{"Alice", 30, 4.73, "Name: Alice, Age: 30, Rating: 4.7"},
{"Bob", 25, 5, "Name: Bob, Age: 25, Rating: 5.0"},
{"Charlie", 40, 3.123, "Name: Charlie, Age: 40, Rating: 3.1"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := BuildProfile(tt.name, tt.age, tt.rating)
assert.Equal(t, tt.expected, result)
})
}
}Решение учителя откроется через:
20:00
