funcmain(){
b :=255var 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
a :=25var b *intif 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
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
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
package main
import("fmt")funcchange(val *int){
*val =55}funcmain(){
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
funchelloWorld()*int{
i :=5return&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.
package main
import("fmt")funcmodify(arr *[3]int){
(*arr)[0]=90}funcmain(){
a :=[3]int{
89,90,91}modify(&a)
fmt.Println(a)}// slice func funcmodifys(sls []int){
sls[0]=90}
a :=[3]int{
89,90,91}modifys(a[:])
fmt.Println(a)
8. Go does not support pointer arithmetic
b :=[...]int{
109,110,111}
p :=&b
p++// invalid operation: p++ (non-numeric type *[3]int)// Go不支持指针算术,而其他语言如C和c++中存在指针算术
二、Structs
1. Creating named structs
package main
import("fmt")type Employee struct{
firstName string
lastName string
age int
salary int}funcmain(){
//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
package main
import("fmt")funcmain(){
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
package main
import("fmt")type Employee struct{
firstName string
lastName string
age int
salary int}funcmain(){
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
package main
import("fmt")type Employee struct{
firstName string
lastName string
age int
salary int}funcmain(){
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
package main
import("fmt")type Employee struct{
firstName string
lastName string
age int
salary int}funcmain(){
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
package main
import("fmt")type Person struct{
stringint}funcmain(){
p1 := Person{
string:"naveen",int:50,}
fmt.Println(p1.string)
fmt.Println(p1.int)}
7. Nested structs
package main
import("fmt")type Address struct{
city string
state string}type Person struct{
name string
age int
address Address
}funcmain(){
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
8. Promoted fields
package main
import("fmt")type Address struct{
city string
state string}type Person struct{
name string
age int
Address
}funcmain(){
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
package main
import("fmt")type name struct{
firstName string
lastName string}funcmain(){
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
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 typefuncmain(){
emp1 := Employee{
name:"Like",
salary:9999,
currency:"$",}
emp1.displaySalary()}// Salary of Like is $9999
2. Pointer Receivers VS Value Receivers
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
}funcmain(){
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
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
}funcmain(){
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
type rectangle struct{
length int
width int}funcarea(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))}funcmain(){
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
type rectangle struct{
length int
width int}funcperimeter(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))}funcmain(){
r := rectangle{
length:10,
width:5,}
p :=&r //pointer to rperimeter(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
type myInt intfunc(a myInt)add(b myInt) myInt {
return a + b
}funcmain(){
num1 :=myInt(5)
num2 :=myInt(10)
sum := num1.add(num2)
fmt.Println("Sum is", sum)}// Sum is 15
文章评论