1包作用域问题
简短变量声明语句只有对已经在同级词法域声明过的变量才和赋值操作语句等价,如果变量是在外部词法域声明的,那么简短变量声明语句将会在当前词法域重新声明一个新的变量。
包中声明的变量,如果在包函数中又额外定义的话,包中声明的变量就没办法被正确的赋值到,只有getDir3()才能正确的给包中声明的变量赋值。
package main
import (
"fmt"
log "github.com/sirupsen/logrus"
"os"
)
var dir string
func main() {
getDir1()
fmt.Printf("After trigger func getDir1() Package variable dir is %#v\n", dir)
getDir2()
fmt.Printf("After trigger func getDir2() Package variable dir is %#v\n", dir)
getDir3()
fmt.Printf("After trigger func getDir3() Package variable dir is %#v\n", dir)
//output
//func getDir1():Dir is "D:\\locoroco\\A-App\\goDemo"
//After trigger func getDir1() Package variable dir is ""
//func getDir2():Dir is "D:\\locoroco\\A-App\\goDemo"
//After trigger func getDir2() Package variable dir is ""
//func getDir3():Dir is "D:\\locoroco\\A-App\\goDemo"
//After trigger func getDir3() Package variable dir is "D:\\locoroco\\A-App\\goDemo"
}
func getDir1() {
dir, err := os.Getwd()
if err != nil {
log.Fatal(err)
os.Exit(0)
}
fmt.Printf("func getDir1():Dir is %#v\n", dir)
}
func getDir2() {
var err error
dir, err := os.Getwd()
if err != nil {
log.Fatal(err)
os.Exit(0)
}
fmt.Printf("func getDir2():Dir is %#v\n", dir)
}
func getDir3() {
var err error
dir, err = os.Getwd()
if err != nil {
log.Fatal(err)
os.Exit(0)
}
fmt.Printf("func getDir3():Dir is %#v\n", dir)
}
2 new函数
表达式new(T)将创建一个T类型的匿名变量,初始化为T类型的零值,然后返回变量地址,返回的指针类型为*T
type person struct {
name string
age int
}
func main() {
var p1 person
var p2 = new(person)
fmt.Printf("p1:%#v, %T, %p\n", p1, p1, &p1)
fmt.Printf("p2:%#v, %T, %p\n", p2, p2, p2)
//p1:main.person{name:"", age:0}, main.person, 0xc0000044c0
//p2:&main.person{name:"", age:0}, *main.person, 0xc0000044e0
}
new函数是一种语法糖,下面两种写法是一样得效果
每次调用new函数都是返回一个新的变量的地址
func newInt() *int {
return new(int)
}
func newInt() *int {
var dummy int
return &dummy
}
3 常量const
- 类型声明过的常量是不变的变量,只能与同样类型的变量比较
- 未类型声明过的常量是字面量,可以和底层结构相同类型的变量比较
const myConst1 = 12
const myConst2 uint8 = 66
var myVar = 30
//output:42, int
fmt.Printf("%#v, %T\n", myConst1 + myVar, myConst1 + myVar)
//error:invalid operation: myConst2 + myVar (mismatched types uint8 and int)
fmt.Printf("%#v, %T\n", myConst2 + myVar, myConst2 + myVar)
package main
import "fmt"
const (
_ = iota
KB = 1 << (10 * iota)
MB
GB
PB
TB
)
func main() {
var disk = 40000000
fmt.Printf("1KB is %v(%b Bytes)\n", KB, KB)
fmt.Printf("disk capacity is %#v MB (%T)\n", disk / MB, disk / MB)
//output
//1KB is 1024(10000000000 Bytes)
//disk capacity is 38 MB (int)
}