【Go基础学习 一】 指针和地址

Go语言基础学习 指针和地址

有几个很不错的学习教程,感觉很不错

  • GitHub开源go学习教程 https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/preface.md
  • B站教程 https://space.bilibili.com/322210472/channel/detail?cid=108884

最后就是go官网了

  • https://golang.org/doc/
  • go官网练习 https://tour.golang.org/list

指针和地址

上来咱就讲指针和地址,go各种数据类型,字符串,数组,map看看语法,多敲敲

可以参考下知乎问题为什么要有指针

我现在的理解就是, 指针通俗来讲就是内存地址,直接通过内存地址修改某个值,这是最直接,也是效率最高的。

下面是练习指针代码,给指针赋值地址 通过地址取值

package main

import "fmt"

func main() {
	a := 123
	fmt.Println(a)
	var b *int // 定义b为指针类型
	b = &a     // & 取地址符号
	*b = 666   // 表示的就是值
	fmt.Println(a, &a, b, *b, &*b)
	// 函数传入地址, 函数内部可以修改值
	changeA1(&a)
	fmt.Println(a) // 777
	changeA2(a)
	fmt.Println(a) // 还是777 不会变成888
	// 同理其他 数据类型 数组 map struct等 可以定义指针

}

func changeA1(z *int) {
	*z = 777
}

func changeA2(n int) {
	n = 888
}

复杂数据类型的指针

package main

import (
	"fmt"
)


func main() {
	a := [3]string{"a", "b", "c"}
	// 定义一个数组指针 外部是一个指针 内部是元素
	var b *[3]string

	b = &a
	// 先通过*b取出array值 然后修改 array里面的值
	(*b)[0] = "zzz"

	fmt.Println(a)

	c := [3]string{"q", "w", "e"}

	// 定义一个指针数组 外部是array 里面元素是指针
	d := [3]*string{&c[0], &c[1], &c[2]}
	fmt.Println(c)
	*d[0] = "qqqqq"
	fmt.Println(d, *d[0])
	fmt.Println(c)

	// 定义一个map key为值 value为 字符串指针
	e := map[string]*string{}
	f := "r"
	e["a"] = &f
	fmt.Println("e是", e)

	// 定义一个map key value都为 字符串指针
	g := map[*string]*string{}
	h := "t"
	i := "y"
	// 字符串指针 key赋予地址 value也赋予地址
	g[&h] = &i
	fmt.Println("g是", g, "取value值", *g[&h])
}

结构体指针

package main

import "fmt"

// 定义一个结构体
type Cat struct {
	name string
	color string
	sex bool
}


func main() {
    // 实例化
	tom := Cat{
		name:"Tom",
		color:"white",
		sex: true,
	}
	fmt.Println(tom)

	// 定义一个结构体指针
	var tom2 *Cat
	// 地址赋值给结构体指针
	tom2 = &tom

	fmt.Println(tom)
	// 结构体指针改变 值
	(*tom2).name = "old tom"
	
	fmt.Println(tom)
}

更多练习代码关注个人博客

个人博客 https://www.charmcode.cn/article/2020-07-26_Go_lets_go

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页