一.变量
变量是通过一个名称绑定一块内存地址,该内存地址所存储的数据类型由定义变量时指定,该内存的地址数据可以被改变;变量声明的方法有多种
1.1 显示的完整声明
package main
import "fmt"
func main() {
var a int = 123
fmt.Println(a)
}
1.2 简短声明
package main
import "fmt"
func main() {
a := 123
fmt.Println(a)
}
PS:go语言支持多个变量同时声明。例:
package main
import "fmt"
func main() {
a, b := 123, 321
fmt.Println(a, b)
}
二.常量
常量支持的数据类型有:数值型,字符串,布尔型,浮点型,基本声明方式为:
package main
import (
"fmt"
)
func main() {
const name datatype = name //单个定义常量
const name datatype = name
const name datatype = name
const ( //多个一起声明
LENGTH string = "helloworld"
test int = 321
true1 bool = true
flast float64 = 12.321
)
fmt.Println(LENGTH, test, true1, flast)
}
- iota标识符
package main
import (
"fmt"
)
func main() {
const (
c1 = iota + 1 //可以进行基础运算
c2
c3
c4
)
fmt.Println(c1, c2, c3, c4)
}
三.基础类型
之前有介绍所有的类型分类,类型的不同存储的数据形态是不同的,英文不好的可能不记得代码中的表示是什么,可以像下面这样去查看。
布尔类型
package main
import (
"fmt"
)
func main() {
a := true
fmt.Printf("this is: %T \n",a)
b := 123
fmt.Printf("this is: %T \n",b)
c := 1.1
fmt.Printf("this is: %T \n",c)
d := "hello world"
fmt.Printf("this is: %T \n",d)
e := 3+6i
fmt.Printf("this is: %T \n",e)
····
}
返回:
this is: bool
this is: int
this is: float64
this is: string
this is: complex128 //这里演示一部分吧,太多了懒得打。。。
四. 指针
4.1定义
指针其实你可以把它想像成一个箭头,这个箭头指向(存储)一个变量的地址
不支持那些乱七八糟的指针移位它就表示一个变量的地址
package main
import (
"fmt"
)
func main() {
var x int
var x_ptr *int
x = 10
x_ptr = &x
fmt.Println(x)
fmt.Println(x_ptr)
fmt.Println(*x_ptr)
}
x的值x的地址通过指针变量输出x的值x_ptr就是一个指针变量
10
0xc084000038
10
取一个变量的地址
考你一下,上面的例子中,如何输出x_ptr的地址呢?
package main
import (
"fmt"
)
func main() {
var x int
var x_ptr *int
x = 10
x_ptr = &x
fmt.Println(&x_ptr)
}
所谓指针就是一个指向(存储)特定变量地址的变量
package main
import (
"fmt"
)
func main() {
var x int
var x_ptr *int
x = 10
x_ptr = &x
fmt.Println(*&x_ptr)
}
指针变量指向(存储)x的地址取这个指针变量x_ptr的地址有另一个指针变量x_ptr_ptr(指向)存储x_ptr指针的地址*x_ptr_ptr取这个x_ptr_ptr指针变量指向(存储)地址所对应的变量的值x_ptr的值指针变量x_ptr指向(存储)的地址x的地址*&
4.2 用途
指针的一大用途就是可以将变量的指针作为实参传递给函数,从而在函数内部能够直接修改实参所指向的变量值。`
Go的变量传递都是值传递。
package main
import (
"fmt"
)
func change(x int) {
x = 200
}
func main() {
var x int = 100
fmt.Println(x)
change(x)
fmt.Println(x)
}
上面的例子输出结果为
100
100
改变的内部变量x值不会改变实参
package main
import (
"fmt"
)
func change(x *int) {
*x = 200
}
func main() {
var x int = 100
fmt.Println(x)
change(&x)
fmt.Println(x)
}
整型指针变量传递的是x的地址*x=200x的值就变了
100
200
初始化一个指针
package main
import (
"fmt"
)
func set_value(x_ptr *int) {
*x_ptr = 100
}
func main() {
x_ptr := new(int)
set_value(x_ptr)
//x_ptr指向的地址
fmt.Println(x_ptr)
//x_ptr本身的地址
fmt.Println(&x_ptr)
//x_ptr指向的地址值
fmt.Println(*x_ptr)
}
new申请存储整型数据的内存地址地址赋值x_ptr指针变量x_ptr指向(存储)的是一个可以存储整型数据的地址这个地址中存储的值x_ptr指向的地址x_ptr本身的地址*x_ptrx_ptr指向的地址中存储的整型数据的值
0xc084000040
0xc084000038
100
五.总结
好了,现在用个例子再来回顾一下指针。
交换两个变量的值。
package main
import (
"fmt"
)
func swap(x, y *int) {
*x, *y = *y, *x
}
func main() {
x_val := 100
y_val := 200
swap(&x_val, &y_val)
fmt.Println(x_val)
fmt.Println(y_val)
}
交叉赋值