误解:=在Go中的用法

I was reading this doc and saw the following fragment:

The := syntax is shorthand for declaring and initializing a variable, e.g. for var f string = "short" in this case.

f := "short"
fmt.Println(f)

The point is: is it only for strings? Or is it dymanic enough to understand what datatype should it store?

And plus: isn't it the same of var f = "short"?

Of course it infers the obvious type(s) returned by the expression on the right side.

The specification gives those examples :

i, j := 0, 10
f := func() int { return 7 }
ch := make(chan int)
r, w := os.Pipe(fd)  // os.Pipe() returns two values
_, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate

Note that it's not dynamic : everything happens at compile time, the type(s) being given by the right part expression.