go语法基础文档
Posted 水月情缘雪飞飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语法基础文档相关的知识,希望对你有一定的参考价值。
go语法基础文档
简介
语言数据类型
一:变量和作用域
1.变量声明
1.第一种,指定变量类型,声明后若不赋值,使用默认值
/* 单个变量声明 */
var v_name v_type
v_name = value
// 示例
var a int
a = 10
/* 类型相同多个变量声明 (非全局变量)*/
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3
// 示例
var a, b int
var c string
a, b, c = 5, 7, "abc"
2.根据值自行判定变量类型
/* 单个变量声明 */
var v_name = value
// 示例
var a = 18
var b = false
/* 多个变量声明,自动判断类型 */
var vname1, vname2, vname3 = v1, v2, v3
// 示例
var a, b, c = 5, 7, "abc"
3.省略var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误
/* 单个变量声明 */
v_name := value
// 示例
a := 19
/* 多个变量声明,自动判断类型 */
vname1, vname2, vname3 := v1, v2, v3
// 示例
a,b,c := 19,false,"string"
2.并行 或 同时 赋值(两个变量的类型必须是相同)
a := 5
b := 7
// 并行计算
a, b = b, a
fmt.Println("a=", a, " b=", b)
// 结果
// a= 7 b= 5
3.空白标识符(抛弃值) _
// 值 5 被抛弃
_, b = 5, 7
//不适用 err 则可以写为 vval,_ = func1()
val, err = Func1(var1)。
二:常量
声明:
const identifier [type] = value
1.显示定义
const b string = "abc"
2.隐式类型定义
const b = "abc"
3.多个常量的声明
const c_name1, c_name2 = value1, value2
// 示例
const a,b = 1,"string"
fmt.Println("a=", a, " b=", b)
4.枚举
const (
Unknown = 0
Female = 1
Male = 2
)
5.常量函数表达式 (函数必须是内置函数: len(), cap(), unsafe.Sizeof() )
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(a)
)
fmt.Println(a, b, c)
// 结果: abc 3 16
6.iota 特殊常量,可以认为是一个可以被编译器修改的常量。
const (
a = iota
b = iota
c = iota
)
fmt.Println(a, b, c)
// 结果 0 1 2
const (
a = iota
b
c
)
fmt.Println(a, b, c)
// 结果 0 1 2
const (
a = iota // 0
b = 18 // 独立值 iota += 1
c = "一个string" // 独立值 iota += 1
d // "一个string"
e // "一个string"
f = iota //恢复计数 iota += 1
g // iota += 1
)
fmt.Println(a, b, c, d, e, f, g)
// 结果: 0 18 一个string 一个string 一个string 5 6
/* 左移 << 表示左移 */
const (
a = 1 << iota
b = 3 << iota
c
d
)
fmt.Println(a, b, c, d)
// 结果: 1 6 12 24
三:运算符
四:条件语句
1.if 语句
if 布尔表达式
else if 布尔表达式
else
// 示例
var a int = 10
if a < 20
fmt.Printf("a 小于 20\\n" )
2.switch 语句
switch
switch var1
case val1:
...
case val2:
...
default:
...
// 示例
var a int = 10
switch a
case 1: // a == 1
case 10: // a == 20
default: // 默认值
Type Switch:判断某个 interface 变量中实际存储的变量类型
switch x.(type)
case type:
statement(s);
case type:
statement(s);
/* 你可以定义任意个数的case */
default: /* 可选 */
statement(s);
// 示例
var x interface
switch i := x.(type)
case nil:
fmt.Printf(" x 的类型 :%T",i)
case int:
fmt.Printf("x 是 int 型")
case float64:
fmt.Printf("x 是 float64 型")
case func(int) float64:
fmt.Printf("x 是 func(int) 型")
case bool, string:
fmt.Printf("x 是 bool 或 string 型" )
default:
fmt.Printf("未知型")
3.select 语句
select
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定义任意数量的 case */
default : /* 可选 */
statement(s);
// 示例
var c1, c2, c3 chan int
var i1, i2 int
select
case i1 = <-c1:
fmt.Printf("received ", i1, " from c1\\n")
case c2 <- i2:
fmt.Printf("sent ", i2, " to c2\\n")
case i3, ok := (<-c3): // same as: i3, ok := <-c3
if ok
fmt.Printf("received ", i3, " from c3\\n")
else
fmt.Printf("c3 is closed\\n")
default:
fmt.Printf("no communication\\n")
五:循环语句
1.for init; condition; post
// 示例
for a := 0; a < 3; a++
fmt.Println(a)
// 结果 0 1 2
2.for condition
// 示例 1
var a, b int = 0, 3
for a < b
a++
fmt.Println(a)
// 结果 1 2 3
// 示例2:无限循环
var i int = 0
for true
i++
3.for
备注:for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环
// 示例
var list = [3]int1, 2, 3
for key, value := range list
fmt.Println("key=", key, "value=", value)
/*
结果
key= 0 value= 1
key= 1 value= 2
key= 2 value= 3
*/
4.循环控制语句
- break 语句 经常用于中断当前 for 循环或跳出 switch 语句
- continue 语句 跳过当前循环的剩余语句,然后继续进行下一轮循环。
- goto 语句 将控制转移到被标记的语句。 参考连接
/* 定义局部变量 */
var a int = 10
/* 循环 */
LOOP: for a < 20
if a == 15
/* 跳过迭代 */
a = a + 1
goto LOOP
fmt.Printf("a的值为 : %d\\n", a)
a++
六:函数
主函数:main 函数 必须存在
func main()
声明:
func 函数名( [函数参数...] ) [返回类型]
函数体
1.函数参数
1.值传递
// 示例1:
max(1,30)
func max(num1, num2 int) int
/* 定义局部变量 */
var result int
if (num1 > num2)
result = num1
else
result = num2
return result
// 示例2:多类型接收与多类型声明返回
func function(a []int, b int, c bool, d map[int][]int) (list []int, data int, err error)
return
// 示例3:多类型接收与多类型返回
func function(a []int, b int, c bool, d map[int][]int) ([]int, int, error)
// 未声明变量,需要函数里声明,return 返回具体的变量
var list = []int
var data int
var err error
return list, data, err
2.引用传递
/* 定义局部变量 */
func man
var a int = 100
var b int= 200
fmt.Printf("交换前,a 的值 : %d\\n", a )
fmt.Printf("交换前,b 的值 : %d\\n", b )
/* 调用 swap() 函数
* &a 指向 a 指针,a 变量的地址
* &b 指向 b 指针,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 地址上的值 */
*x = *y /* 将 y 值赋给 x */
*y = temp /* 将 temp 值赋给 y */
/*
执行结果:
交换前,a 的值 : 100
交换前,b 的值 : 200
交换后,a 的值 : 200
交换后,b 的值 : 100
*/
2.函数用法
1.函数作为值
/* 声明函数变量 */
getSquareRoot := func(x float64) float64
// 开平方根
return math.Sqrt(x)
/* 使用函数 */
fmt.Println(getSquareRoot(9))
2.闭包
匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。
func main
/* nextNumber 为一个函数,函数 i 为 0 */
nextNumber := getSequence()
/* 调用 nextNumber 函数,i 变量自增 1 并返回 */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())
/* 创建新的函数 nextNumber1,并查看结果 */
nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
func getSequence() func() int
i := 0
return func() int
i += 1
return i
3.函数方法(类)
/* 定义结构体 */
type Circle struct
radius float64
func main()
var c1 Circle
c1.radius = 10.00
fmt.Println("圆的面积 = ", c1.getArea())
//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64
//c.radius 即为 Circle 类型对象中的属性
return 3.14 * c.radius * c.radius
七:数组
声明:
var variable_name [SIZE] variable_type
初始化数组
1.固定长度数组
备注:
- [] 设定数组个数
- 是数组元素
- 数组中 中的元素个数不能大于 [] 中的数字
var a [10]int
var b [10] int
var c = []int1, 2, 3, 4, 5, 6
2.无限长度数组
备注:
- 忽略 [] 中的数字不设置数组大小,根据元素的个数来设置数组的大小
var a []int
var b [] int
var c = []int1, 2, 3, 4, 5, 6
访问数组元素
备注:
- 数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推
1.一维数组
var n [3]int /* n 是一个长度为 3 的数组 */
fmt.Println(len(n))
var length = len(n) // 数组的长度为3
/* 为数组 n 初始化元素 */
for i := 0; i < length; i++
n[i] = i + 100 /* 设置元素为 i + 100 */
/* 数组元素读取 */
for i := 0; i < length; i++
fmt.Println(i, n[i])
/*
执行结果:
3
0 100
1 101
2 102
*/
2.多维数组
var threedim [3][4][5]int
fmt.Println(threedim)
/*
执行结果:
[
[
[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]
]
[
[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]
]
[
[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]
]
]
*/
// 赋值
array[0][1][1] = 10
// 读取
fmt.Println(array[0][1][1])
3.函数传递数组
1.方式一:形参设定数组大小
void myFunction(param [10]int)
2.方式二:形参未设定数组大小
void myFunction(param []int)
示例:
func function(arr []int, data [5]int)
八:指针
指针:一个指针变量指向了一个值的内存地址
声明:
var var_name *var-type
var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针
var ip *int /* 指向整型*/
var fp *float32 /* 指向浮点型 */
1.指针使用
- 定义指针变量。
- 为指针变量赋值。
- 访问指针变量中指向地址的值。
// 定义指针变量
var a int = 20
var b *int
// 赋值
b = &a /* 指针变量的存储地址 */
fmt.Printf("a 变量的地址是: %x\\n", &a)
/* 指针变量的存储地址 */
fmt.Printf("b 变量储存的指针地址: %x\\n", b)
/* 使用指针访问值 */
fmt.Printf("*b 变量的值: %d\\n", *b)
2.空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil,nil 指针也称为空指针
var ptr *int
fmt.Printf("ptr 的值为 : %x\\n", ptr)
if (ptr == nil)
fmt.Println("ptr = nil")
/*
执行结果:
ptr 的值为 : 0
ptr = nil
*/
3.指针数组
a := []int10, 100, 200
var i int
var ptr [3]*int;
for i = 0; i < 3; i++
ptr[i] = &ago语言基础之格式化输出