
指针
指针的概念
指针概念在Go语言中分为两个概念
-
类型指针,允许对这个指针类型的数据进行更改,传递数据使用指针,无需拷贝数据;和c/c++不同的是类型指针不能进行偏移和运算
-
切片,由指向起始元素的元素指针,元素数量和容量组成
-
Go语言中的指针相较简单,只需要知道指针地址,指针类型,指针取值几个概念即可
指针地址与指针类型
每个变量在运行时都拥有一个内存地址,Go语言中使用”&”放在变量前,去取变量的内存地址。
- 示例:
package main
import "fmt"
func main() {
str1:="I love Go"
fmt.Printf("str1 内存地址: %p\n",&str1)
}
// 输出:
$ go run "./tempCodeRunnerFile.go"
str1 内存地址: 0xc000010060
获取指针指向的值
-
在变量使用“&”获取内存地址后,可以使用”*”获取指针地址/指针变量指向的值
-
示例:
package main
import "fmt"
func main() {
str1:="I love Go"
fmt.Printf("str1 内存地址: %p\n",&str1)
fmt.Printf("str1 变量类型:%T\n",str1)
fmt.Printf("str1 的值:%s\n",*&str1)
}
// 输出:
$ go run "./tempCodeRunnerFile.go"
str1 内存地址: 0xc000010200
str1 变量类型:string
str1 的值:I love Go
使用指针修改值
- 示例:
package main
import (
"fmt"
)
func swap(a, b *int) {
t := *a
*a = *b
*b = t
}
func main() {
x, y := 1, 2
swap(&x, &y)
fmt.Printf("X:%d,Y:%d\n", x, y)
}
// 输出:
$ go run "./指针修改值.go"
X:2,Y:1
创建指针的另一种方法
- 格式:
new(Type)
- 示例:
package main
import (
"fmt"
)
func main() {
a := new(int)
*a = 100
fmt.Println(a, *a)
}
输出:
$ go run "./指针创建new.go"
0xc0000aa000 100
常量
相对于变量,常量就是恒定不变的量,例如圆周率,一周几天;常量的声明和变量的声明非常类似,只是把var换成const
const pi = 3.1415926
const (
name = "lisong"
sex = "man"
)
常量的枚举
Go语言的枚举是要常量配合iota模拟,常量的作用:如果在编码过程中如果常量的值特别多,很容易重复或者写错,使用iota自动生成就很方便了
package main
import "fmt"
const (
num1 = 1 << iota
num2
num3
num4
)
const (
num11 = 1 + iota
num12
num13
num14
)
func main() {
fmt.Println(num1, num2, num3, num4)
fmt.Println(num11, num12, num13, num14)
}
// 输出:
$ go run "./常量的枚举.go"
1 2 4 8
1 2 3 4
将枚举值转换成字符串
- 使用String()方法的Week在使用上和普通常量上没有区别,当这个类型需要显示为字符串时,Go语言会自动找String()方法并进行调用
package main
import "fmt"
type Week int
const (
Sunday Week = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
func (w Week) String() string { // 必须定义方法名字为String()的方法
switch w {
case Sunday:
return "Sunday"
case Monday:
return "Monday"
case Tuesday:
return "Tuesday"
case Wednesday:
return "Wednesday"
case Thursday:
return "Thursday"
case Friday:
return "Friday"
case Saturday:
return "Saturday"
default:
return "None"
}
}
func main() {
fmt.Printf("iota:%d\nstring:%s\n", Monday, Monday)
}
//输出:
$ go run "./枚举值转换字符串.go"
iota:1
string:Monday
类型别名
类型别名与类型定义
- 定义区别
type newInt int // 类型定义
type aliasInt = int // 类型别名
- 示例:
package main
import "fmt"
type newInt int
type aliasInt = int
func main() {
var (
a newInt
b aliasInt
)
fmt.Printf("a的类型:%T\nb的类型:%T\n", a, b)
}
//输出:
go run "./类型别名类型定义区别.go"
a的类型:main.newInt
b的类型:int
非本地类型不能定义方法
- 一般类型别名不能定义方法,类型定义可以定义方法,类型别名如果想要定义方法,类型别名定义必须定义在原类型所在的包中