1.函数
1.1go函数定义格式:
func function_name( [parameter list] ) [return_types]
{
函数体
}
- func:函数由 func 开始声明
- function_name:函数名称,函数名和参数列表一起构成了函数签名。
- parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
- return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
- 函数体:函数定义的代码集合。
1.2 函数调用
package main
import "fmt"
func main() {
var a int = 100
var b int = 200
var ret int
ret = max(a, b)
fmt.Printf( "最大值是 : %d\n", ret ) // 最大值是 : 200
}
// max函数 注意:如果max与main不在同一个文件中,命名需大驼峰 Max
func max(num1, num2 int) int {
var result int
if (num1 > num2) {
result = num1
} else {
result = num2
}
return result
}
1.3 函数参数
调用函数,有两种方式传传递参数。
1.3.1 值传递
实例:
package main
import "fmt"
func main() {
var a int = 100
var b int = 200
fmt.Printf("交换前 a 的值为 : %d\n", a )
fmt.Printf("交换前 b 的值为 : %d\n", b )
swap(a, b)
fmt.Printf("交换后 a 的值 : %d\n", a )
fmt.Printf("交换后 b 的值 : %d\n", b )
}
func swap(x, y int) int {
var temp int
temp = x
x = y
y = temp
return temp;
}
/*
交换前 a 的值为 : 100
交换前 b 的值为 : 200
交换后 a 的值 : 100
交换后 b 的值 : 200
*/ 说明值传递没有影响实际参数。
1.3.2 引用传递
package main
import "fmt"
func main() {
var a int = 100
var b int= 200
fmt.Printf("交换前,a 的值 : %d\n", a )
fmt.Printf("交换前,b 的值 : %d\n", b )
swap(&a, &b)
fmt.Printf("交换后,a 的值 : %d\n", a )
fmt.Printf("交换后,b 的值 : %d\n", b )
}
func swap(x *int, y *int) {
var temp int
temp = *x
*x = *y
*y = temp
}
/*
交换前,a 的值 : 100
交换前,b 的值 : 200
交换后,a 的值 : 200
交换后,b 的值 : 100
*/ 说明引用传递影响实际参数。
1.4.函数方法
实例:
package main
import (
"fmt"
)
type Circle struct {
radius float64
}
func main() {
var c1 Circle
c1.radius = 10.00
fmt.Println("Area of Circle(c1) = ", c1.getArea()) // Area of Circle(c1) = 314
}
//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
//c.radius 即为 Circle 类型对象中的属性
return 3.14 * c.radius * c.radius
}
#
2.数组
2.1 初始化数组
var balance [10] float32 // 定义了数组 balance 长度为 10 类型为 float32
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0} // {}中元素个数不能大于[]中的数字。
2.2 访问数组元素
func Arr() {
var n [10]int
//var i,j int
var i int
for i = 0; i < 10; i++ {
n[i] = i + 100
fmt.Printf("Element[%d] = %d\n", i, n[i])
}
//for j = 0; j < 10; j++ {
// fmt.Printf("Element[%d] = %d\n", j, n[j])
//}
}
2.3 向函数传递数组
package main
import "fmt"
func main() {
var balance = []int {1000, 2, 3, 17, 50}
var avg float32
avg = getAverage( balance, 5 ) ;
fmt.Printf( "平均值为: %f ", avg );
}
func getAverage(arr []int, size int) float32 {
var i,sum int
var avg float32
for i = 0; i < size;i++ {
sum += arr[i]
}
avg = float32(sum / size)
return avg;
}
3. 指针
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
package main
import "fmt"
func main() {
var a int = 10
fmt.Printf("变量的地址: %x\n", &a ) // 变量的地址: 20818a220
}
一个指针变量可以指向任何一个值的内存地址。
3.1 声明指针
var var_name *var-type
var ip *int
var fp *float32
3.2 指针变量赋值与访问
在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。
package main
import "fmt"
func main() {
var a int= 20
var ip *int
ip = &a
fmt.Printf("a 变量的地址是: %x\n", &a )
fmt.Printf("ip 变量的存储地址: %x\n", ip )
fmt.Printf("*ip 变量的值: %d\n", *ip )
}
/*
a 变量的地址是: 20818a220
ip 变量的存储地址: 20818a220
*ip 变量的值: 20
*/
3.3 go空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。 nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
一个指针变量通常缩写为 ptr。
package main
import "fmt"
func main() {
var ptr *int
fmt.Printf("ptr 的值为 : %x\n", ptr ) // ptr 的值为 : 0
}
3.4 指针的指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址。 声明:
var ptr **int;
访问指向指针的指针变量值需要使用两个 * 号
package main
import "fmt"
func main() {
var a int
var ptr *int
var pptr **int
a = 3000
ptr = &a
pptr = &ptr
fmt.Printf("变量 a = %d\n", a )
fmt.Printf("指针变量 *ptr = %d\n", *ptr )
fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
}
/*
变量 a = 3000
指针变量 *ptr = 3000
指向指针的指针变量 **pptr = 3000
*/
4.结构体
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性:
- Title :标题
- Author : 作者
- Subject:学科
- ID:书籍ID
实例:
package main
import "fmt"
type Books struct {
title string
author string
subject string
book_id int
}
func main() {
var Book1 Books
var Book2 Books
Book1.title = "Go 语言"
Book1.author = "www.shouce.ren"
Book1.subject = "Go 语言教程"
Book1.book_id = 6495407
Book2.title = "Python 教程"
Book2.author = "www.shouce.ren"
Book2.subject = "Python 语言教程"
Book2.book_id = 6495700
fmt.Printf( "Book 1 title : %s\n", Book1.title)
fmt.Printf( "Book 1 author : %s\n", Book1.author)
fmt.Printf( "Book 1 subject : %s\n", Book1.subject)
fmt.Printf( "Book 1 book_id : %d\n", Book1.book_id)
fmt.Printf( "Book 2 title : %s\n", Book2.title)
fmt.Printf( "Book 2 author : %s\n", Book2.author)
fmt.Printf( "Book 2 subject : %s\n", Book2.subject)
fmt.Printf( "Book 2 book_id : %d\n", Book2.book_id)
}
/*
Book 1 title : Go 语言
Book 1 author : www.shouce.ren
Book 1 subject : Go 语言教程
Book 1 book_id : 6495407
Book 2 title : Python 教程
Book 2 author : www.shouce.ren
Book 2 subject : Python 语言教程
Book 2 book_id : 6495700
*/