go语言语法记录
Posted daixixi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言语法记录相关的知识,希望对你有一定的参考价值。
go
- 基本语法
- 变量
变量类型
变量类型有哪些?var value string = "haha
包内变量
不可以使用
:=
符号来定义变量函数内变量
可以使用:=
定义,然后只在函数内有效
定义即需要使用自动类型推断
var value = "haha
value := "haha
强制类型转换
c = int(math.Sqrt(float64(a*a+ b*b)))
常量的定义
const filename = ‘abc.txt‘
const 数值可以作为各种类型使用,在你没有指定类型的情况下,它可以直接将值拷贝给其他类型
const a,b = 3,4 var c int = int(Math.Sqrt(a*a+b*b))
枚举类型
普通枚举
const ( a = 1 b = 2 c = 3 d = 4 )
自增值枚举类型
const ( a = iota b c d )
条件语句
if
没有括号if
条件里可以赋值,且赋值的变量作用域只在if
里可以用
func bounded (v int ) int if v>100 return 100 else if v < 0 return 0 else return v
switch
不需要break
语句,除非使用fallthrough
来主动添加break
switch
后面可以没有表达式func grade(score int) string value := "" switch case score < 0 || score > 100: value = "error" case score < 60: value = "不及格" case score < 80: value = "及格" case score < 100: value = "良好" case score == 100: value = "优秀" return value
循环
- for
- for 的条件里不需要括号
- for的条件里可以省略初始条件,结束条件,递增表达式(省略递增条件后就是一个死循环了)
- 没有
while
- for
函数
指针
package main import "fmt" func voidCopy (a int) a++ func voidRef(a *int) *a++ func main() a := 3 voidCopy(a) // 这里只是拷贝了一份值过来进行运算 fmt.Println(a) voidRef(&a) // 这里是直接取变量地址传入后取值进行自增 fmt.Println(a)
看到指针就应该思考到值传递还是引用传递?go语言函数只有值传递一种方式,所有参数都会被拷贝一份,思考当传递的参数是一个数值的时候,可以考虑使用指针获取地址进行传递直接修改原数据,而如果传递的参数是对象等引用类型的话,那么传递过来的本身就是引用地址!
数组
var arr1 [5]int arr2 := [3]int 3,4,5 arr3 := [...]int 3,4,5,6,7 var grid [4][5]int
// range 下列写法可以获得下标和值 for i, v := range arr3 fmt.Println(i) fmt.Println(v) // 定义必须得用,所以可以使用下划线进行省略变量 for _, v := range arr3 fmt.Println(v)
数组是值类型(使用的时候是拷贝)调用它的时候是值拷贝,一般不使用数组而是使用切片
func printArray(arr [5]int) for i,v :=range arr fmt.Println(i,v) // arr2 和 arr3、arr1不同,它不是[5] int 类型的 printArray(arr3) printArray(arr1) //printArray(arr2)
切片
slice
arr := [...]int 0,1,2,3,4,5,6,7,8,9 fmt.Println("arr: ", arr ) fmt.Println("arr[2:6]: ",arr[2:6]) fmt.Println("arr[:6]: ",arr[:6]) fmt.Println("arr[2:]: ",arr[2:]) fmt.Println("arr[:]: ",arr[:]) // output arr: [0 1 2 3 4 5 6 7 8 9] arr[2:6]: [2 3 4 5] arr[:6]: [0 1 2 3 4 5] arr[2:]: [2 3 4 5 6 7 8 9] arr[:]: [0 1 2 3 4 5 6 7 8 9]
slice本身没有数据,是对底层array的一个view
func main() arr := [...]int 0,1,2,3,4,5,6,7,8,9 s := arr[:] s[0] = 20 s[3] = 200 fmt.Println(arr) // [20 1 2 200 4 5 6 7 8 9]
Reslice
arr := [...]int 0,1,2,3,4,5,6,7,8,9 fmt.Println(arr) s := arr[:5] fmt.Println(s) s = s[:2] fmt.Println(s) // output // [0 1 2 3 4 5 6 7 8 9] // [0 1 2 3 4] // [0 1]
超出切片的下标会如何显示?
arr := [...]int 0,1,2,3,4,5,6,7,8,9 fmt.Println(arr) s := arr[2:5] fmt.Println(s) s1 := s[3:5] fmt.Println(s1) // output /* [0 1 2 3 4 5 6 7 8 9] [2 3 4] [5 6] */
slice
有ptr
,len
,cap
分别第一个,长度,向后的全部元素slice
可以向后扩展,不可以向前扩展,s[i]不可以超过len(s)
,向后扩展不可以超过底层数组cap(s)
切片的操作
如何添加数字?
s = append(s1,val)
由于值传递的原因,必须接受
append
的返回值添加元素时如果超越
cap
,系统会重新分配更大的底层数组
- 容器
- 变量
- 面向接口
- 结构体
- dock typing
- 组合的思想
以上是关于go语言语法记录的主要内容,如果未能解决你的问题,请参考以下文章