Go: Именованные утверждения типа и преобразования

Если у меня есть настраиваемый тип, который просто переопределяет предопределенный тип с именем:

type Answer string

И я пытаюсь использовать его в функции, которая принимает предопределенный тип:

func acceptMe(str string) {
    fmt.Println(str)
}

func main() {
    type Answer string
    var ans Answer = "hello"

    // cannot use ans (type Answer) as type string in function argument
    acceptMe(ans)          
    // invalid type assertion: ans.(string) (non-interface type Answer on left)
    acceptMe(ans.(string)) 
    // Does work, but I don't understand why if the previous doesn't:
    acceptMe(string(ans))
}

Почему утверждение типа терпит неудачу, но преобразование работает?

Ответ 1

Утверждение типа работает только для интерфейсов. Интерфейс может иметь произвольный базовый тип, поэтому у нас есть тип assertion и type switch для спасения. Утверждение типа возвращает bool как второе возвращаемое значение, чтобы указать, было ли утверждение успешным.

У вашего пользовательского типа Answer может быть только один базовый тип. Вы уже знаете точный тип - Answer и базовый тип - string. Вам не нужны утверждения, так как преобразование в базовый тип всегда будет успешным.

Старый ответ:

Просто преобразуйте свой собственный тип в string. Преобразование будет выполнено, так как ваш пользовательский тип string является базовым типом. Синтаксис преобразования: string (ans). Go Play