Go > Core Go Basics > Fundamental Data Types > Strings (string)
Working with Strings in Go
This example demonstrates fundamental operations with strings in Go, covering declaration, immutability, concatenation, and common functions.
String Declaration and Initialization
This code snippet showcases how to declare and initialize strings in Go. You can use the `var` keyword followed by the string type and assign a value. Alternatively, you can use the short variable declaration `:=` for concise initialization, inferring the type from the assigned value. Both methods achieve the same result of storing a string value in a variable.
package main
import "fmt"
func main() {
// String declaration and initialization
var greeting string = "Hello, Go!"
message := "Welcome to the world of Go strings."
fmt.Println(greeting)
fmt.Println(message)
}
String Immutability
Strings in Go are immutable, meaning their values cannot be changed after they are created. Attempting to modify a specific character within a string using indexing (e.g., `str[0] = 'g'`) will result in a compile-time error. To "modify" a string, you need to create a new string by combining parts of the original string with new characters or strings. In the example provided the string "Go" is not modified directly. Instead, a new string "go" is built by combining the character 'g' with a substring of the original string.
package main
import "fmt"
func main() {
str := "Go"
// str[0] = 'g' // This will cause a compile-time error
newStr := "g" + str[1:]
fmt.Println(newStr)
}
String Concatenation
Strings can be concatenated using the `+` operator. This creates a new string by joining the operands. For more complex string formatting, `fmt.Sprintf` provides a powerful and flexible way to create strings with embedded variables and specific formatting options. It allows you to insert values of different types into a string using format specifiers like `%s` (for strings) and `%d` (for integers).
package main
import "fmt"
func main() {
part1 := "Go is"
part2 := " awesome!"
// String concatenation using the + operator
result := part1 + part2
fmt.Println(result)
// Using fmt.Sprintf for formatted string concatenation
name := "Alice"
age := 30
formattedString := fmt.Sprintf("Name: %s, Age: %d", name, age)
fmt.Println(formattedString)
}
Common String Functions (len, Substring)
The `len()` function returns the length of a string in bytes. For strings containing Unicode characters (runes), it's often more appropriate to use `utf8.RuneCountInString()` from the `unicode/utf8` package to get the number of runes (characters). Substrings can be extracted using slicing. The expression `str[start:end]` creates a new string containing the characters from index `start` (inclusive) to index `end` (exclusive). The `start` index defaults to 0, and the `end` index defaults to the length of the string if omitted. When using substrings on Unicode, pay close attention to UTF-8 encoding to ensure it is handled properly.
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "Hello, δΈη!"
// Get the length of the string (number of bytes)
byteLength := len(str)
fmt.Println("Byte Length:", byteLength)
// Get the length of the string (number of runes/characters)
runeLength := utf8.RuneCountInString(str)
fmt.Println("Rune Length:", runeLength)
// Substring using slicing
substring := str[0:5] // Extracts "Hello"
fmt.Println("Substring:", substring)
}
Real-Life Use Case: Data Validation
Strings are used extensively for data validation. For example, you might check if an email address is in a valid format, or if a password meets certain complexity requirements (minimum length, special characters, etc.). Regular expressions (using the `regexp` package) are commonly used for these kinds of validation tasks.
Best Practices
Interview Tip
Be prepared to discuss string immutability in Go and its implications. Explain how to "modify" a string by creating a new string. Also, understand the difference between `len()` and `utf8.RuneCountInString()`.
When to use them
Use strings for any textual data: names, addresses, descriptions, configurations, etc. Strings are fundamental to almost every Go application.
Memory footprint
Strings in Go are backed by a byte array. The memory footprint depends on the length of the string and the characters it contains. ASCII characters take 1 byte per character. Unicode characters (runes) can take 1-4 bytes depending on the specific character.
Alternatives for String Manipulation
While the `+` operator and `fmt.Sprintf` are useful, the `strings` package provides a comprehensive set of functions for more advanced string manipulation, like searching, replacing, splitting, joining, and more. Also, `bytes.Buffer` and `strings.Builder` are useful for efficiently building strings through multiple appends.
Pros of Using Strings
Cons of Using Strings
FAQ
-
How do I convert a string to an integer in Go?
Use the `strconv.Atoi()` function. It returns an integer and an error. Always check the error to handle potential parsing failures. Example: `num, err := strconv.Atoi("123")` -
How do I convert an integer to a string in Go?
Use the `strconv.Itoa()` function. Example: `str := strconv.Itoa(123)` -
How do I iterate over the runes in a string?
Use a `for...range` loop. This loop automatically handles UTF-8 encoding and provides the rune and its starting byte index for each character in the string. Example: `for index, runeValue := range myString { ... }`