2015-03-16 10 views
1

Я после глобальной струны,Реализация динамических строк в golang

studentName := "Hi ? ,Welcome" 

Теперь я хочу взять эту строку динамически

func returnName(name string) string{ 
    return studentName+name 
} 

Эта функция должна возвращать строку как

Hi name,welcome. 

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

+1

Я думаю, что 'fmt.Sprintf' - лучший способ пойти, если у вас нет сложной обработки шаблонов. –

+0

yes, thanx для уведомления :) –

ответ

6

Если вы хотите, чтобы все было просто, вы, вероятно, можете просто использовать fmt.Sprintf.

studentName := fmt.Sprintf("Hi, %s! Welcome.", name) 

%s часть будет заменяются значением name.

+1

Это самое простое, наиболее очевидное решение, если не требуется сложный шаблон, действительно нет причин не выбирать этот, OP –

+0

i предположим, что это правильный выбор для ответа –

2

Вы могли бы рассмотреть функцию strings.Replace

return Replace(studentName, "? ", name, 1) 

С '1', он заменяет первый "?" Он находит в studentName.
Замена возвращает копию studentName, с "? " заменяется на name.

Это строго уважать первоначальный вопрос (глобальные переменные с этим точным содержанием)


Теперь, если вы начинаете изменение вопрос, как, например, с различным содержанием (глобальная переменная studentName := "Hi %s ,Welcome"), затем вы можете использовать fmt.Sprintf() как в 425nesp «s answer

return fmt.Sprintf(studentName, name) 

Это горе uld использует формат «глаголы» %s, формат по умолчанию для строки.

+0

thanx, это самое простое решение :) –

0

Предполагая, что глобальная строка всегда одна и та же, что вы могли бы сделать.

func returnName(name string) string { 
    buf := bytes.Buffer{} 
    buf.WriteString("Hi ") 
    buf.WriteString(name) 
    buf.WriteString(", welcome") 
    return buf.String() 
} 

или

func returnName(name string) string { 
    return "Hi " + name + ", welcome" 
} 

если строка представляет собой динамический шаблон можно использовать пакет шаблонов или просто заменить, если есть привычка быть другой ? знаков или Sprintf

4

Если вход становится больше (более сложным), или если вам нужно несколько раз заменять разные значения, тогда шаблоны более эффективны, чисты и более гибкие. Ознакомьтесь с пакетом text/template.

Пакет template анализирует ваш шаблон один раз, строит дерево из него, и как только вам нужно заменить значения, он строит вывод «на лету».

Взгляните на этот пример:

const templ = `Hi {{.Name}}! 
Welcome {{.Place}}. 
Please bring {{.ToBring}} 
` 

Вы можете разобрать такой шаблон строки:

t := template.Must(template.New("").Parse(templ)) 

Приготовьте свои входные данные либо как struct или как map:

data := map[string]string{ 
    "Name": "Bob", 
    "Place": "Home", 
    "ToBring": "some beers", 
} 

И вы можете получить результат с помощью Template.Execute():

t.Execute(os.Stdout, data) // Prints result to the standard output 

Вот полный, запускаемым пример: (попробуйте на Go Playground)

package main 

import (
    "os" 
    "text/template" 
) 

func main() { 
    data := map[string]string{ 
     "Name": "Bob", 
     "Place": "Home", 
     "ToBring": "some beers", 
    } 
    t := template.Must(template.New("").Parse(templ)) 
    t.Execute(os.Stdout, data) // Prints result to the standard output 

    // Now change something: 
    data["Name"] = "Alice" 
    data["ToBring"] = "a Teddy Bear" 
    t.Execute(os.Stdout, data) 
} 

const templ = ` 
Hi {{.Name}}! 
Welcome {{.Place}}. 
Please bring {{.ToBring}} 
` 

Выход:

Hi Bob! 
Welcome Home. 
Please bring some beers 

Hi Alice! 
Welcome Home. 
Please bring a Teddy Bear 

Получение результата как string :

Если вы хотите результат как string, вы можете записать результат в виде bytes.Buffer и получить string используя Buffer.String() метод:

buf := bytes.Buffer{} 
t.Execute(&buf, data) 
var result string = buf.String() 

Полная программа (попробуйте на Go Playground):

package main 

import (
    "bytes" 
    "fmt" 
    "text/template" 
) 

func main() { 
    data := map[string]string{ 
     "Name": "Bob", 
     "Place": "Home", 
     "ToBring": "some beers", 
    } 
    fmt.Print(Execute(data)) 
} 

var t = template.Must(template.New("").Parse(templ)) 

func Execute(data interface{}) string { 
    buf := bytes.Buffer{} 
    t.Execute(&buf, data) 
    return buf.String() 
} 

const templ = ` 
Hi {{.Name}}! 
Welcome {{.Place}}. 
Please bring {{.ToBring}} 
` 
Смежные вопросы