今天学的是变量类型、声明、赋值等
值的类型
- int/uint类型长度取决于本机架构,要么32要么64
当然可以直接声明int8 int16 int32 int64,uint8 uint16 uint32 uint64,byte
byte是uint8的别称,本质是一样的 - 没有float类型,没有double类型,只有float64和float32
- 无论是什么架构,int32长度就是32不会变,int64等也同理
- 每一种类型都是独立的,不可混用,比如int8不可以和int32一起运算
声明变量
不允许声明不使用的变量,比如下面是错误案例,并且导入的库也没有用
package main
import (
"fmt"
)
func main() {
var int a
}
变量的默认值
package main
import (
"fmt"
)
func main() {
//变量的默认值
var a int
//a int 直接输出是错误的
//定义int,默认是0,string 默认是""
fmt.Println(a)
//0
var a float64
fmt.Println(a)
//0
}
变量的赋值
八进制,十六进制,科学记数法是支持的,比如077,0xFF,6.022e23
package main
import (
"fmt"
)
func main() {
//变量的赋值
//1.声明与赋值分开
var b int
b = 15
fmt.Println(b)
//2.声明并赋值
//这个形式只能用在函数内
c := true
fmt.Println(c)
//声明并赋值的第二个形式
var d int32
d = 18
fmt.Println(d)
}
甚至不说明类型都是可以的
package main
import (
"fmt"
)
func main() {
var a = 16
fmt.Println(a)
//但以下操作是错的
//var a
//a = 16
//fmt.Println(a)
//这个也是错的
//a = 16
//fmt.Println(a)
}
平行赋值
package main
import (
"fmt"
)
func main() {
//多个变量平行赋值
a, b := false, 20
fmt.Println(a, b)
//false 20
//特殊变量名_
//赋给_的所有值都会被丢弃
//同时注意,_是不可以被输出的
_, c := false, true
fmt.Println(c)
//true
}
声明成组
package main
import (
"fmt"
)
func main() {
//变量的赋值
//var声明成组,同样的import,const也可以
var (
e int
f bool
)
fmt.Println(e, f)
//0 false
}
常量
package main
import (
"fmt"
)
func main() {
const (
a = 15
b = 16
)
fmt.Println(a, b)
//15 16
}
利用iota生成枚举值
package main
import (
"fmt"
)
func main() {
const (
a = iota
b = iota
)
fmt.Println(a, b)
//0 1
}
后面的iota可以省略
package main
import (
"fmt"
)
func main() {
const (
a = iota
b //Implicitly b=iota
)
fmt.Println(a, b)
//0 1
}
string
string是不可变的,不像C那样,不可以赋值完一个串直接通过改变某个位置的字符改变这个串
多行串
s:="hello"
+"world"
会被解析成
s:="hello";
+"world";
这显然不对,但是改下+的位置就可以了
s:="hello"+
"world"
还有一个办法是用反引号`
这下连加号都不用了
package main
import (
"fmt"
)
func main() {
s1 := `hello
world`
fmt.Println(s1)
s2 := `hello
world`
fmt.Println(s2)
s3 := "hello" +
"world"
fmt.Println(s3)
}
这个输出还是挺有意思的
hello
world
hello
world
helloworld
rune
rune是int32的别名,这个在遍历字符串的字符时会用到
复数
Go原生支持复数,变量类型是complex128(虚数部分64位)
package main
import (
"fmt"
)
func main() {
var reim complex128 = 5 + 5i
fmt.Printf("%v", reim)
//%v表示以默认格式打印
//(5+5i)
}
错误
error是一种接口,值为nil
package main
import (
"fmt"
)
func main() {
var e error
fmt.Println(e)
//<nil>
}
一个小尝试:既然只导入了fmt库,那么我不用fmt.Println()直接用Println()也没有二义性吧,但是这样的尝试是失败的,报错是导入了fmt又没有使用,是的,之前也有讨论过,Go是不允许导入不使用的库的。