Golang Convert String to io.Writer?
Asked Answered
K

3

68

Is it possible to convert a string to an io.Writer type in Golang?

I will be using this string in fmt.Fprintf() but I am unable to convert the type.

Kahlil answered 30/3, 2016 at 7:31 Comment(1)
Why don't use fmt.Sprintf()?Nephralgia
M
117

You can't write into a string, strings in Go are immutable.

The best alternatives are the bytes.Buffer and since Go 1.10 the faster strings.Builder types: they implement io.Writer so you can write into them, and you can obtain their content as a string with Buffer.String() and Builder.String(), or as a byte slice with Buffer.Bytes().

You can also have a string as the initial content of the buffer if you create the buffer with bytes.NewBufferString():

s := "Hello"
buf := bytes.NewBufferString(s)
fmt.Fprint(buf, ", World!")
fmt.Println(buf.String())

Output (try it on the Go Playground):

Hello, World!

If you want to append a variable of type string (or any value of string type), you can simply use Buffer.WriteString() (or Builder.WriteString()):

s2 := "to be appended"
buf.WriteString(s2)

Or:

fmt.Fprint(buf, s2)

Also note that if you just want to concatenate 2 strings, you don't need to create a buffer and use fmt.Fprintf(), you can simply use the + operator to concatenate them:

s := "Hello"
s2 := ", World!"

s3 := s + s2  // "Hello, World!"

Also see: Golang: format a string without printing?

It may also be of interest: What's the difference between ResponseWriter.Write and io.WriteString?

Miss answered 30/3, 2016 at 7:33 Comment(1)
Could you give me an example of how I could use a variable with a type of string in the function fmt.Fprintf() please. :)Kahlil
M
13

I saw the other answer mention strings.Builder, but I didn't see an example. So here you go:

package main

import (
   "fmt"
   "strings"
)

func main() {
   b := new(strings.Builder)
   fmt.Fprint(b, "south north")
   println(b.String())
}

https://golang.org/pkg/strings#Builder

Machinery answered 2/4, 2021 at 18:11 Comment(1)
In the case of strings.Builder, you can also use .WriteString(s string) method on builder instead of passing builder to fmt.Fprint.Annmarie
V
2

Use bytes.Buffer which implements the Write() method.

import "bytes"

writer := bytes.NewBufferString("your string")
Volleyball answered 13/8, 2019 at 20:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.