Why can't a string be nil in Go?

user319286

The program available on The Go Playground reads

package main

import "fmt"

func main() {
    var name string = nil
    fmt.Println(name)
}

and yields an error

prog.go:6: cannot use nil as type string in assignment

I understand "" is the "zero value" for strings. I don't understand why I cannot assign nil to my string.

LemurFromTheId

The simple answer is that nil is not defined to be a valid value for type string in the language specification.

...but maybe you want a longer answer?

nil is the zero value for pointers, interfaces, channels, slices, maps and function types, and it represents an uninitialized state.

Consider the following variable declarations:

var a *SomeType
var b interface{}
var c func()

It seems natural that all these variables would have a value that represents uninitialized state. a has been declared as a pointer, but what would it point to, when we haven't yet pointed it at anything? nil is an obvious zero value for these types.

As for channels, slices and maps, their zero value is nil for the simple reason that their implementation is such that they must be explicitly initialized before they can be used. This is mostly for performance reasons, these types are all represented internally as more or less complex data structures, and initializing them is not free.

However, a string doesn't require initialization, and it seems natural that the default, zero value for a new string variable would be an empty string, "". Therefore there's simply no reason for nil to be a valid string value, and adding it to the specification would only make the language more complicated and much more cumbersome to work with.

Furthermore, what would nil of type string represent? An empty string? We already have that. An uninitialized string? There's no such thing.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Object parameter is nil, can't determine why

From Dev

Can't understand why UISegmentedControl is returning nil

From Dev

Why can not convert [Size]byte to string in Go?

From Dev

Why can't I append string to byte slice as the Go reference specified?

From Dev

Why is my string nil?

From Dev

Why can’t VLC go in to fullscreen mode?

From Dev

Why can't I compare a procedural variable to nil?

From Dev

Why I can't use 'object== nil' in Swift?

From Java

How to Return Nil String in Go?

From Dev

Ruby File.open can't convert nil into String (TypeError)

From Dev

Mysql2 0.3.15 TypeError: can't convert nil into String

From Dev

Why can't _ be used inside of string interpolation?

From Dev

why I can't use string as id

From Java

Why can't I find this string in RegEx?

From Dev

Why can't we take a pointer to a string?

From Dev

Why can't I pass a string to @input

From Dev

Why can't get string with PIL and pytesseract?

From Dev

why can't cast Object[] to String[]

From Dev

Why can't I convert this String to a URL?

From Dev

Why string can't be converted to object class

From Dev

Why can't I write a static string?

From Dev

Why is it valid to assign <nil> to an interface type in Go?

From Dev

In Go, why isn't the stringer interface used when casting to string?

From Dev

Why can't Go iterate maps in insertion order?

From Dev

Why can't you name a function in Go "init"?

From Dev

Why can't go parse the time represented by the provided formats?

From Dev

Why can't go build from absolute path?

From Dev

Why can't I go directly to the Oracle sign on page?

From Dev

why can't I go for intent instead of pending intent?

Related Related

HotTag

Archive