这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
今天的主要和大家分享go的基础知识部分,主要包括变量常量和一部分基础类型介绍。
变量和常量
func main() {
var a int //声明一个int型的变量,默认值是0
fmt.Println("a的默认值是:", a)
fmt.Printf("a的类型是:%T \n", a)
var b int = 1
fmt.Println("a的默认值是:", b)
fmt.Printf("a的类型是:%T \n", b)
c := "字符串" //短声明方式
fmt.Printf("c的类型是: %T,c的值是: %s \n", c, c)
}
/* a的默认值是: 0
a的类型是:int
a的默认值是: 1
a的类型是:int
c的类型是: string,c的值是: 字符串 */
短声明的其他注意事项:短变量声明
一次声明多个变量:
var (
n = 1,
m = 2
)
var q, p = 1, 2
go中的常量可以使用const来声明,同时在go里也可以用来做枚举:
const n = 1000
const (
BEIJING = 1
TIANJIN = 2
)
同时go也提供了iota作为常量计数器,使用方法:
func main() {
const (
a = 10 * iota
b
c
)
fmt.Printf("%d %d %d\n", a, b, c)
}
//0 10 20 不加10来设置步长 则默认为 0 1 2
大值常量
常量可以储存很大的值,此时其描述为无类型,并且在go底层使用big包进行处理:
func main() {
const a = 200000000000000000000 // untyped int 没办法直接输出,但是可以进行运算,此时go底层使用big包处理
const b = 22343
const c = a / b
fmt.Println(c) // 8951349415924450
}
数据类型
整形 Integer
int 包括 int8 int16 int32 int64 其中直接声明int型,变量根据系统是32位还是64位,决定其大小占几位和范围。例如64位系统下,int就和int64一样
无符号整形 unsignedInteger:
uint包括 uint8 uint16 uint32 uint64
浮点型 float
float包括 float32 和 float64
小知识: 如果一个指数型的数字( a := 2e5 )没有被指定类型的时候,那么它默认为float64类型,因为float64的范围是很大的,这和其精度没有关系,其最大值为1.8e308。
字符串 string
string类型是字符串,go里面必须使用双引号包裹
切分字符串
可以利用创建切片的语法来切分字符串:
func main() {
s := "hello world"
s2 := s[:5]
fmt.Println(s2) // hello
}
注意
s := "a"
s = s[1:]
上述写法并不会报错,而是返回一个空字符串。
大数 big
虽然我们可以使用float64来很大的数,但这样不能保证对应的精度。此时我们可以使用big包来获取很大同时保证精度的值:
// 使用newInt创建,函数接收值为一个int64类型的数
a := big.NewInt(12)
// 使用SetString创建超过int64上限的大数
a := new(big.Int)
a.SetString("240000000000000000000000000000000000000000", 10)
字符 Rune
用来表示字符,并且兼容中文,韩文等特殊符号等字符,其本质是一个int32。
// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32
数组
var arr [5]int
arr[0] = 1
//短声明
arr := [5]int{15, 20} //后面不声明的默认是0
//通过制定索引,对某几个元素进行赋值
arr4 := [5]int{1: 100, 4:200}
//让编译器帮忙计算值
arr4 := [...]int{14, 20}
注意数组的长度也是数类型的一部分,例如[3]int和[5] int不是一种类型。所以函数一般是使用切片而不是数组作为形参。
数组是一个值类型,并不是一个引用类型。如果我们传递数组需要使用同一个地址而不是复制,可以使用指针:
func main() {
a1 := [...]int{1, 2, 3}
a2 := &a1
(*a2)[1] = 3
fmt.Println(a1, *a2) //[1 3 3] [1 3 3]
}