var 变量名 变量类型//举例:声明两个变量都为int指针类型var a, b *int
//方式一:使用关键字var和花括号{},可以将一组变量定义放在一起var{a intb stringc byted []float32e func()boolf struct{x int}}//方式二:把变量定义和初始化放在一起:名字 := 表达式。//但这种方式有以下限制:1.不能提供数据类型;2.只能用在函数内部func main(){x := 10a, s := 1, "abc"}
//方式一:var 变量名 类型 = 表达式var a int = 10//方式二:省略其类型,采用编译器推导类型的格式L:var 变量名 = 表达式var a = 10//方式三:更精简的写法,省略关键字var: 变量名 := 表达式a := 10//注意:1.由于使用了:=,而不是=,因此方式三的写法的左边变量名必须是没有定义过的变量,若该变量定义过,则编译器会报错2.在多个短变量声明和复制中,至少又一个新声明的变量出现在左值中,即使其他变量名可能是重复声明的,编译也不会出错,如下所示:res1, err := MyTest(2)res2, err := MyTest(3)
/*var a int = 100var b int = 200a, b = b, a*/package mainimport "fmt"func main(){var a int = 100b := 200fmt.Println("a = ", a," b = ", b)b, a = a, bfmt.Println("a = ", a," b = ", b)}
结果:
package mainimport "fmt"func GetTheData()(int, int){a := 200b := 300return a, b}func main(){a, _ := GetTheData()_, b := GetTheData()fmt.Printf("a=%d, b=%d",a, b)}
结果:
//常量的声明const a = 3.1415926//常量的批量声明const{b = 2.12345c = 1.23455}
//math.Pi可无类型的浮点数常量,可直接用于任意需要浮点或者复数的地方var x float32 = math.Pivar y complex128 = math.Pivar z float64 = math.Pi
const Pi float64 = math.Pivar x float32 = Pi //x的精度就会改变var y float32 = (float32)Pi //y进行了类型转换,精度不会变var z complex128 = (complex128)Pi //z进行了类型转换,精度不会变
类型名 | 含义 |
---|---|
bool | 布尔型,true、false |
string | 字符串类型 |
int、int8、int32、int64 | 有符号整型 |
uint、uint8、uint16、uint32、uint64、uintptr | 无符号整型 |
byte | 字符类型 |
rune | 字符类型 |
float32、float64 | 浮点型 |
complex64、complex128 | 复数类型 |
//var name complex128 = complex(x,y)package mainimport "fmt"func main(){var x complex128 = complex(1,2) //1 + 2ivar y complex128 = complex(3,4) //3 + 4ifmt.Println(x * y)fmt.Println(real(x * y))fmt.Println(imag(x * y))var z complex128 = complex(-5,10)var w complex128 = complex(5,10)fmt.Println(x * y == z)fmt.Println(x * y == w)}
结果:
package mainimport "fmt"func main(){var ch int = '\u0041'var ch2 byte = 'A'var ch3 int = '\U00000061'fmt.Println(ch, ch2, ch3)fmt.Printf("ch=%c, ch2=%c, ch3=%c", ch,ch2,ch3)}
结果:
package mainimport ("fmt""unicode")func main(){var ch rune = 'A'var gi rune = '1'var sp rune = ' 'fmt.Println(unicode.IsLetter(ch))fmt.Println(unicode.IsLetter(gi))fmt.Println(unicode.IsDigit(ch))fmt.Println(unicode.IsDigit(gi))fmt.Println(unicode.IsSpace(sp))}
结果:
package mainimport ("fmt")func main(){const str = `aaaabbbbccccdddd`fmt.Println(str)}
结果:
package mainimport ("fmt""math")func main(){fmt.Println("int range:", math.MinInt, math.MaxInt)fmt.Println("int8 range:", math.MinInt8, math.MaxInt8)fmt.Println("int16 range:", math.MinInt16, math.MaxInt16)fmt.Println("int32 range:", math.MinInt32, math.MaxInt32)fmt.Println("int64 range:", math.MinInt64, math.MaxInt64)var a int32 = 912345678//将a转换为十六进制,会发生数值截断fmt.Printf("int32:0x%x, %d\n", a,a)var pi float32 = 3.14fmt.Println(pi)fmt.Println(int(pi))}
结果:
package mainimport "fmt"func main(){a := 100b := 'a'c := "hello world"fmt.Printf("a的地址是%p, b的地址是%p,c的地址是%p\n", &a, &b, &c)aptr := &abptr := &bcptr := &cfmt.Printf("a的地址是%p, b的地址是%p,c的地址是%p\n", aptr, bptr, cptr)fmt.Println("a的值是", *aptr)fmt.Printf("b的值是%c\n", *bptr)fmt.Println("c的值是", *cptr)//指针的类型fmt.Printf("aptr的类型是%T\n", aptr)fmt.Printf("bptr的类型是%T\n", bptr)fmt.Printf("cptr的类型是%T\n", cptr)}
结果:
package mainimport "fmt"func main(){iptr := new(int)stptr := new(string)*iptr = 100*stptr = "hello world"fmt.Println("*iptr=",*iptr)fmt.Println("*stptr=",*stptr)a := 200*iptr = afmt.Println("*iptr=",*iptr)}
结果:
package mainimport "fmt"type NewInt int //类型定义type IntNew = int //类型别名func main(){var a NewInt //使用类型定义,定义的新类型fmt.Printf("a的类型为:%T\n",a)var b IntNew //使用类型别名,定义的新类型fmt.Printf("b的类型为:%T\n",b)}
结果:
上述结果不难发现,a的类型是main.NewInt,即main包下定义的NewInt类型;b的类型还是int类型。而IntNew该类型只会在代码中存在,编译完成后就不会存在。
package mainimport "fmt"func main(){type NewInt int //类型定义var a NewInt = 100 //使用类型定义,定义的新类型var b int = 200var c int = 300fmt.Println("a的值为", a)fmt.Println("b的值为", b)fmt.Println("c的值为", c)b = int(a)a = NewInt(c)fmt.Println("a的值为", a)fmt.Println("b的值为", b)fmt.Println("c的值为", c)}
结果:
package mainimport "fmt"func main(){type IntNew = int //类型别名var a IntNew = 100 //使用类型别名,定义的新类型var b int = 200var c int = 300fmt.Println("a的值为", a)fmt.Println("b的值为", b)fmt.Println("c的值为", c)b = a //类型别名与源类型就是同一类型,故可以直接相互赋值a = cfmt.Println("a的值为", a)fmt.Println("b的值为", b)fmt.Println("c的值为", c)}
结果: