"%! s" -подобная ошибка в fmt.Printf, когда строка формата взята из аргументов (перейти на язык) - PullRequest
0 голосов
/ 22 сентября 2018

просто посмотрите код: (так просто, что я сам не могу поверить)

package log

import "fmt"

func P(format string,a ...interface{}){
    fmt.Printf(format,a)
}

при вызове где-то так:

log.P("%s,%s,%d","","",0)

Я получил ошибку:

[  %!s(int=0)],%!s(MISSING),%!d(MISSING)

НО, если я вызываю fmt.Printf прямо так:

fmt.Printf("%s,%s,%d","","",0)

Он работает отлично, просто идеально (конечно, как базовое использование fmt).

ТакВопрос:

Почему log.P не работает ??

К вашему сведению:

Я считаю, что это довольно просто, но я просто не могунайти ответ от Google, никогда не кто-нибудь упал в ад?

Или, может быть, я просто не знаю, как спросить, поэтому я поставил чистый код выше.

Или просто я супердурак на этот раз?

Я подписался на stackoverflow сегодня для ответа на этот вопрос.Дай мне знать, что со мной не так.Как только ...

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Вам нужно передать a в Printf как переменную и для преобразования массива в переменную, вы должны следовать этой записи:

func P(format string, a ...interface{}){
    fmt.Printf(format, a...)
}

Язык программирования GoСпецификация

Передача аргументов в ... параметры

Если f является переменной с конечным типом параметра ... T, то внутри функции аргумент эквивалентенк параметру типа [] T.При каждом вызове f аргумент, передаваемый в последний параметр, является новым слайсом типа [] T, чьи последовательные элементы являются фактическими аргументами, и все они должны присваиваться типу T. Следовательно, длина слайса - это числоаргументы связаны с последним параметром и могут отличаться для каждого сайта вызова.


0 голосов
/ 22 сентября 2018

Это просто маленькая ошибка.Вы вызываете fmt.Printf с a в качестве единственного аргумента, а это не так.Вам нужно передать его в качестве аргумента переменной.

package main

import (
    "fmt"
)

func P(format string, a ...interface{}) {
    fmt.Printf(format, a)
}

func P2(format string, a ...interface{}) {
    fmt.Printf(format, a...)
}

func main() {
    P("%s,%s,%d", "", "", 0)
    fmt.Println()
    P2("%s,%s,%d", "hello", "world", 0)
}

Вы можете прочитать о параметрах переменной здесь .

...