Go语言复习笔记——基本语法(二)之常量指针与类型别名

2,583 阅读2分钟

指针

指针的概念

指针概念在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

非本地类型不能定义方法

  • 一般类型别名不能定义方法,类型定义可以定义方法,类型别名如果想要定义方法,类型别名定义必须定义在原类型所在的包中