Использовать строковое значение определенного типа как строку

avatar
Increasingly Idiotic
8 апреля 2018 в 08:59
800
4
3

У меня есть определенный именованный тип

type User string

и теперь я хочу использовать значение User как фактическую строку, например так

func SayHello(u User) string {
    return "Hello " + user + "!"
}

Но я получаю сообщение об ошибке:

не может использовать "Привет" + пользователь + "!" (введите User) как строку типа в возвращаемом аргументе

Как использовать именованный тип в качестве базового типа?

Источник

Ответы (4)

avatar
Himanshu
8 апреля 2018 в 09:16
1

Из спецификации Golang

Значение x присваивается переменной типа T ("x присваивается Т"), если:

  • тип x идентичен T.
  • типы V и T x имеют идентичные базовые типы, и по крайней мере один из V или T не является определенным типом.

Переменные именованного типа type User string и неименованного типа var user string абсолютно разные. Мы можем проверить это, используя отражение для отображения базового типа.

package main

import (
    "fmt"
    "reflect"
    )

type User string

func main() {
    var name User = "User"
    var name2 string = "User"
    //fmt.Print(name==name2) // mismatched types User and string
    fmt.Println(reflect.TypeOf(name2))
    fmt.Println(reflect.TypeOf(name))
}

Поэтому проверьте базовый тип переменной, а затем приведите тип к примитивному, чтобы сравнить значение.

package main

import (
    "fmt"
)

type User string

func main() {
    var u User
    fmt.Print(SayHello(u))
}

func SayHello(u User) string {
    change := string(u)
    return "Hello " + change + "!"
}

Проверить Игровая площадка Go

Himanshu
8 апреля 2018 в 11:10
1

@IncreasinglyIdiotic Всегда обращайтесь к спецификациям golang, если что-то сбивает с толку.

avatar
Peter
8 апреля 2018 в 10:46
2

В Go нет определений типов.

Два типа либо идентичны, либо различны.

Определенный тип всегда отличается от любого другого типа.

User является определенным типом и, следовательно, отличается от типа string.

Поскольку базовым типом User является строка, вы можете просто преобразовать один тип в другой:

"Hello " + string(user) + "!"
avatar
Bohdan Kostko
8 апреля 2018 в 09:14
0

Вы можете использовать fmt.Sprintf без дополнительного преобразования вашего аргумента или объединения ваших частей строк:

func SayHello(u User) string {
    return fmt.Sprintf("Hello %s!", u)
}

Даже если вы измените тип с string на struct, вы все равно сможете использовать SayHello, если реализуете метод func (u *User) String() string. Однако такой подход также будет работать для обычного преобразования string, предоставляемого goofle.

.

Попробуйте на https://play.golang.org/p/XnxeOucPZdE.

avatar
goofle
8 апреля 2018 в 09:02
1

В этом случае вы можете использовать return "Hello " + string(user) + "!"