Go语言基础:Pointer指针、Structs结构体、Methods方法详细教程案例

目录标题

  • 一、Pointer
    • [1. Declaring pointers](#1. Declaring pointers)
    • [2. Zero value of a pointer](#2. Zero value of a pointer)
    • [3. Creating pointers using the new function](#3. Creating pointers using the new function)
    • [4. Dereferencing a pointer](#4. Dereferencing a pointer)
    • [5. Passing pointer to a function](#5. Passing pointer to a function)
    • [6. Returning pointer from a function](#6. Returning pointer from a function)
    • [7. Do not pass a pointer to an array as an argument to a function. Use slice instead.](#7. Do not pass a pointer to an array as an argument to a function. Use slice instead.)
    • [8. Go does not support pointer arithmetic](#8. Go does not support pointer arithmetic)
  • 二、Structs
    • [1. Creating named structs](#1. Creating named structs)
    • [2. Creating anonymous structs](#2. Creating anonymous structs)
    • [3. Accessing individual fields of a struct](#3. Accessing individual fields of a struct)
    • [4. Zero value of a struct](#4. Zero value of a struct)
    • [5. Pointers to a struct](#5. Pointers to a struct)
    • [6. Anonymous fields](#6. Anonymous fields)
    • [7. Nested structs](#7. Nested structs)
    • [8. Promoted fields](#8. Promoted fields)
    • [9. Structs Equality](#9. Structs Equality)
  • 三、Methods
    • [1. Sample Method](#1. Sample Method)
    • [2. Pointer Receivers VS Value Receivers](#2. Pointer Receivers VS Value Receivers)
    • [3. Methods of anonymous struct fields](#3. Methods of anonymous struct fields)
    • [4. Value receivers in methods VS Value arguments in functions](#4. Value receivers in methods VS Value arguments in functions)
    • [5. Pointer receivers in methods VS Pointer arguments in functions](#5. Pointer receivers in methods VS Pointer arguments in functions)
    • [6. Methods with non-struct receivers](#6. Methods with non-struct receivers)

一、Pointer

1. Declaring pointers

go 复制代码
	func main() {
		b := 255
		var a *int = &b
		fmt.Printf("Type of is %T\n", a)   // 获取值的类型
		fmt.Println("address of b is ", a) // 内存地址
		fmt.Println(b, *a)                 // 两种方法指向值
	}
	
	// Type of is *int
	// address of b is  0xc0000180c8
	// 255 255

2. Zero value of a pointer

go 复制代码
	a := 25
	var b *int
	if b == nil {
		fmt.Println("b is", b)
		b = &a	// 指向a的内存地址
		fmt.Println("b after initialization is", b)
	}

	// b is <nil>
	// b after initialization is 0xc0000180c8

3. Creating pointers using the new function

go 复制代码
	size := new(int)
	fmt.Printf("Size value is %d, type is %T, address is %v\n", *size, size, size)
	*size = 85
	fmt.Println("New size value is", *size)
	
	// Size value is 0, type is *int, address is 0xc0000a6058
	// New size value is 85

4. Dereferencing a pointer

go 复制代码
	b := 255
	a := &b
	fmt.Println("address of b is", a)
	fmt.Println("value of b is", *a)
	*a++
	fmt.Println("new values is", b)

	//address of b is 0xc0000180c8
	//value of b is 255
	//new values is 256

5. Passing pointer to a function

go 复制代码
	package main
	
	import (  
	    "fmt"
	)
	
	func change(val *int) {  
	    *val = 55
	}
	func main() {  
	    a := 58
	    fmt.Println("value of a before function call is",a)
	    b := &a
	    change(b)
	    fmt.Println("value of a after function call is", a)
	}
	
	// value of a before function call is 58  
	// value of a after function call is 55  

6. Returning pointer from a function

go 复制代码
	func helloWorld() *int {
		i := 5
		return &i
	}
	
	func main{
	    d := helloWorld()
	    fmt.Println("value of d", d)
	}
	
	// value of d 0xc0000180c8

7. Do not pass a pointer to an array as an argument to a function. Use slice instead.

go 复制代码
	package main
	
	import (  
	    "fmt"
	)
	
	func modify(arr *[3]int) {  
	    (*arr)[0] = 90
	}
	
	func main() {  
	    a := [3]int{89, 90, 91}
	    modify(&a)
	    fmt.Println(a)
	}
	
	// slice func	
	
	func modifys(sls []int) {
		sls[0] = 90
	}
	
	a := [3]int{89, 90, 91}
	modifys(a[:])
	fmt.Println(a)

8. Go does not support pointer arithmetic

go 复制代码
	b := [...]int{109, 110, 111}
	p := &b
	p++ // invalid operation: p++ (non-numeric type *[3]int)


	// Go不支持指针算术,而其他语言如C和c++中存在指针算术

二、Structs

1. Creating named structs

go 复制代码
	package main
	
	import (  
	    "fmt"
	)
	
	type Employee struct {  
	    firstName string
	    lastName  string
	    age       int
	    salary    int
	}
	
	func main() {
	
	    //creating struct specifying field names
	    emp1 := Employee{
	        firstName: "Sam",
	        age:       25,
	        salary:    500,
	        lastName:  "Anderson",
	    }
	
	    //creating struct without specifying field names
	    emp2 := Employee{"Thomas", "Paul", 29, 800}
	
	    fmt.Println("Employee 1", emp1)
	    fmt.Println("Employee 2", emp2)
	}

2. Creating anonymous structs

go 复制代码
	package main
	
	import (  
	    "fmt"
	)
	
	func main() {  
	    emp3 := struct {
	        firstName string
	        lastName  string
	        age       int
	        salary    int
	    }{
	        firstName: "Andreah",
	        lastName:  "Nikola",
	        age:       31,
	        salary:    5000,
	    }
	
	    fmt.Println("Employee 3", emp3)
	}

3. Accessing individual fields of a struct

go 复制代码
	package main
	
	import (  
	    "fmt"
	)
	
	type Employee struct {  
	    firstName string
	    lastName  string
	    age       int
	    salary    int
	}
	
	func main() {  
	    emp6 := Employee{
	        firstName: "Sam",
	        lastName:  "Anderson",
	        age:       55,
	        salary:    6000,
	    }
	    fmt.Println("First Name:", emp6.firstName)
	    fmt.Println("Last Name:", emp6.lastName)
	    fmt.Println("Age:", emp6.age)
	    fmt.Printf("Salary: $%d\n", emp6.salary)
	    emp6.salary = 6500
	    fmt.Printf("New Salary: $%d", emp6.salary)
	}
	
	// First Name: Sam  
	// Last Name: Anderson  
	// Age: 55  
	// Salary: $6000  
	// New Salary: $6500 

4. Zero value of a struct

go 复制代码
	package main
	
	import (  
	    "fmt"
	)
	
	type Employee struct {  
	    firstName string
	    lastName  string
	    age       int
	    salary    int
	}
	
	func main() {  
	    emp5 := Employee{
	        firstName: "John",
	        lastName:  "Paul",
	    }
	    fmt.Println("First Name:", emp5.firstName)
	    fmt.Println("Last Name:", emp5.lastName)
	    fmt.Println("Age:", emp5.age)
	    fmt.Println("Salary:", emp5.salary)
	}
	
	// First Name: John  
	// Last Name: Paul  
	// Age: 0  
	// Salary: 0  

5. Pointers to a struct

go 复制代码
	package main
	
	import (  
	    "fmt"
	)
	
	type Employee struct {  
	    firstName string
	    lastName  string
	    age       int
	    salary    int
	}
	
	func main() {  
	    emp8 := &Employee{
	        firstName: "Sam",
	        lastName:  "Anderson",
	        age:       55,
	        salary:    6000,
	    }
	    fmt.Println("First Name:", (*emp8).firstName)
	    fmt.Println("Age:", (*emp8).age)
	}
	
	// First Name: Sam  
	// Age: 55 

6. Anonymous fields

go 复制代码
	package main
	
	import (  
	    "fmt"
	)
	
	type Person struct {  
	    string
	    int
	}
	
	func main() {  
	    p1 := Person{
	        string: "naveen",
	        int:    50,
	    }
	    fmt.Println(p1.string)
	    fmt.Println(p1.int)
	}

7. Nested structs

go 复制代码
	package main
	
	import (  
	    "fmt"
	)
	
	type Address struct {  
	    city  string
	    state string
	}
	
	type Person struct {  
	    name    string
	    age     int
	    address Address
	}
	
	func main() {  
	    p := Person{
	        name: "Naveen",
	        age:  50,
	        address: Address{
	            city:  "Chicago",
	            state: "Illinois",
	        },
	    }
	
	    fmt.Println("Name:", p.name)
	    fmt.Println("Age:", p.age)
	    fmt.Println("City:", p.address.city)
	    fmt.Println("State:", p.address.state)
	}
	
	
	// Name: Naveen  
	// Age: 50  
	// City: Chicago  
	// State: Illinois
go 复制代码
	package main
	
	import (  
	    "fmt"
	)
	
	type Address struct {  
	    city  string
	    state string
	}
	type Person struct {  
	    name string
	    age  int
	    Address
	}
	
	func main() {  
	    p := Person{
	        name: "Naveen",
	        age:  50,
	        Address: Address{
	            city:  "Chicago",
	            state: "Illinois",
	        },
	    }
	
	    fmt.Println("Name:", p.name)
	    fmt.Println("Age:", p.age)
	    fmt.Println("City:", p.city)   //city is promoted field
	    fmt.Println("State:", p.state) //state is promoted field
	}
	
	// Name: Naveen  
	// Age: 50  
	// City: Chicago  
	// State: Illinois  

9. Structs Equality

go 复制代码
	package main
	
	import (  
	    "fmt"
	)
	
	type name struct {  
	    firstName string
	    lastName  string
	}
	
	func main() {  
	    name1 := name{
	        firstName: "Steve",
	        lastName:  "Jobs",
	    }
	    name2 := name{
	        firstName: "Steve",
	        lastName:  "Jobs",
	    }
	    if name1 == name2 {
	        fmt.Println("name1 and name2 are equal")
	    } else {
	        fmt.Println("name1 and name2 are not equal")
	    }
	
	    name3 := name{
	        firstName: "Steve",
	        lastName:  "Jobs",
	    }
	    name4 := name{
	        firstName: "Steve",
	    }
	
	    if name3 == name4 {
	        fmt.Println("name3 and name4 are equal")
	    } else {
	        fmt.Println("name3 and name4 are not equal")
	    }
	}
	
	
	// name1 and name2 are equal  
	// name3 and name4 are not equal  

三、Methods

1. Sample Method

go 复制代码
	package main
	
	import (
		"fmt"
	)
	
	type Employee struct {
		name     string
		salary   int
		currency string
	}
	
	func (e Employee) displaySalary() {
		fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary)
	}	//   displaySalary() method has Employee as the receiver type
	
	func main() {
		emp1 := Employee{
			name:     "Like",
			salary:   9999,
			currency: "$",
		}
		emp1.displaySalary()
	}
	
	
	// Salary of Like is $9999

2. Pointer Receivers VS Value Receivers

go 复制代码
	package main
	
	import "fmt"
	
	type Employees struct {
		name string
		age  int
	}
	
	func (e Employees) changeName(newName string) { // 值接收器
		e.name = newName
	}
	func (e *Employees) changeAge(newAge int) { // 指针接收器 必须添加*号否则修改不成功
		e.age = newAge
	}
	
	func main() {
		e := Employees{
			name: "Like",
			age:  21,
		}
		fmt.Printf("Employees name brfore change: %s", e.name)
		e.changeName("XiaoXiao")
		fmt.Printf("\nEmployees name after change: %s", e.name)
		fmt.Printf("\nEmployees age brfore change: %d", e.age)
		//e.changeAge(18)
		(&e).changeAge(19) // &e使用指针的方法接收
		fmt.Printf("\nEmployees age after change: %d", e.age)
	}
	
	// Employees name brfore change: Like
	// Employees name after change: Like
	// Employees age brfore change: 21
	// Employees age after change: 19

3. Methods of anonymous struct fields

go 复制代码
	type address struct {
		city  string
		state string
	}
	
	func (a address) fullAddress() {
		fmt.Printf("Full address: %s, %s", a.city, a.state)
	}
	
	type person struct {
		firstName string
		lastName  string
		address
	}
	
	func main() {
		p := person{
			firstName: "Li",
			lastName:  "ke",
			address: address{
				city:  "Los Angeles",
				state: "California",
			},
		}
		p.fullAddress()
	}
	
	// Full address: Los Angeles, California

4. Value receivers in methods VS Value arguments in functions

go 复制代码
	type rectangle struct {
		length int
		width  int
	}
	
	func area(r rectangle) {
		fmt.Printf("Area Function result: %d\n", (r.length * r.width))
	}
	
	func (r rectangle) area() {
		fmt.Printf("Area Method result: %d\n", (r.length * r.width))
	}
	func main() {
		r := rectangle{
			length: 10,
			width:  5,
		}
	
		area(r)
		r.area()
		p := &r
		p.area()
	}
	
	// Area Function result: 50
	// Area Method result: 50
	// Area Method result: 50

5. Pointer receivers in methods VS Pointer arguments in functions

go 复制代码
	type rectangle struct {
		length int
		width  int
	}
	
	func perimeter(r *rectangle) {
		fmt.Println("perimeter function output:", 2*(r.length+r.width))
	}
	
	func (r *rectangle) perimeter() {
		fmt.Println("perimeter method output:", 2*(r.length+r.width))
	}
	func main() {
		r := rectangle{
			length: 10,
			width:  5,
		}
	
		p := &r //pointer to r
		perimeter(p)
		p.perimeter()
		r.perimeter() //calling pointer receiver with a value
	}
	
	// perimeter function output: 30
	// perimeter method output: 30
	// perimeter method output: 30

6. Methods with non-struct receivers

go 复制代码
	type myInt int
	
	func (a myInt) add(b myInt) myInt {
		return a + b
	}
	
	func main() {
		num1 := myInt(5)
		num2 := myInt(10)
		sum := num1.add(num2)
		fmt.Println("Sum is", sum)
	}
	
	// Sum is 15
相关推荐
重生之我在20年代敲代码8 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
爱上语文10 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
serve the people13 分钟前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
2401_858286113 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py3 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy3 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
C-SDN花园GGbond5 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
罗政6 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
迷迭所归处6 小时前
C++ —— 关于vector
开发语言·c++·算法