Go Lang
1 Go 的基础组成有以下几部分
- 包声明
- 引入包
- 函数
- 变量
- 语句&表达式
- 注释
package mainimport "fmt"func main(){
/**/
fmt.Println("hello,world!")
}
- 每个 Go 应用程序都包含一个名为 main 的包
- fmt 包实现了格式化 IO(输入/输出)的函数
- 下一行 func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )
需要注意的是 { 不能单独放在一行,所以以下代码在运行时会产生错误:
-
文章图片
文件名与包名没有直接关系,不一定要将文件名与包名定成同一个。
文件夹名与包名没有直接关系,并非需要一致。
同一个文件夹下的文件只能有一个包名,否则编译报错。
···
Go 语法基础 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。如以下 GO 语句由 6 个标记组成:
文章图片
文章图片
数据类型 Go语言变量 声明变量的一般形式是使用 var 关键字:
var identifier type
package mainimport "fmt"
function main(){
var a string = "Runoob"
fmt.Println(a)var b,c int = 1,2
fmt.Println(b,c)
变量声明
- 第一种,指定变量类型,如果没有初始化,则变量默认为零值
- 第二种,根据值自行判断变狼类型
- 第三种,省略var,注意:=左侧如果没有声明新的变量,就产生编译错误
intVal := 1 // 此时不会产生编译错误,因为有声明新的变量,因为 := 是一个声明语句
相当于
var intVal int
intVal =1
多变量声明
//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要显示声明类型,自动推断vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误// 这种因式分解关键字的写法一般用于声明全局变量
var (
vname1 v_type1
vname2 v_type2
)
值类型和引用类型
Go语言常量
const identifier [type] = value
多个相同类型的声明可以简写为:
const c_name1, c_name2 = value1, value2
常量还可以用作枚举
const (
Unknown = 0
Female = 1
Male = 2
)
iota
iota,特殊常量,可以认为是一个可以被编译器修改的常量。
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
iota 可以被用作枚举值:
const (
a = iota
b = iota
c = iota
)
package mainimport "fmt"func main() {
const (
a = iota//0
b//1
c//2
d = "ha"//独立值,iota += 1
e//"ha"iota += 1
f = 100//iota +=1
g//100iota +=1
h = iota//7,恢复计数
i//8
)
fmt.Println(a,b,c,d,e,f,g,h,i)
}
package mainimport "fmt"
const (
i=1<
Go 语言运算符 其他运算符
文章图片
Go 语言条件语句 switch
switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。
switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。
switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough 。
switch var1 {
case val1:
...
case val2:
...
default:
...
}
Go语言循环 for 循环
for init;
condition;
post{}
for condition{}
for{}
for 循环的range格式可以对slice、map、数组、字符串等进行迭代循环
for key,value := range oldMap{
newMap[key] = vaule
}
package main
import "fmt"func main() {
strings := []string{"google", "runoob"}
for i, s := range strings {
fmt.Println(i, s)
}numbers := [6]int{1, 2, 3, 5}
for i,x:= range numbers {
fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
}
}
Go 语言函数
func function_name( [parameter list] ) [return_types] {
函数体
}
返回多个值
package mainimport "fmt"func swap(x, y string) (string, string) {
return y, x
}func main() {
a, b := swap("Google", "Runoob")
fmt.Println(a, b)
}
函数参数
默认情况下, Go语言使用的事值传递,即再调用过程中不会影响到实际参数
函数用法
- 函数作为另外一个函数的实参
package mainimport ( "fmt" "math )func main(){ getSquareRoot := func(x float64) float64{ return math.Sqrt(x) }fmt.Println(getSquareRoot(9)) }
- 闭包
Go 语言支持匿名函数,可作为闭包。 匿名函数是一个”内联“语句或表达式。匿名函数的优越性在于可以直接使用函数内部的变量,不必申明。
package mainimport "fmt"func getSequence() func() int {
i:=0return func() int {
i+=1
return i
}
}func main(){
nextNumber := getSequence()fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
- 方法
int -> 0
float32 -> 0
pointer -> nil
Go语言数组 声明数组
var variable_name [size] variable_type
var balance [10] float32
初始化数组
var balance = [5]float32{100.0,2.0.3.4,7.0,50.0}
balance := [5]float32{1000.0,2.0,3.4,6.0,50.0}
如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推断数组的长度:
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
或
balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
如果设置了数组的长度,我们还可以通过指定下标来初始化元素:
//将索引为 1 和 3 的元素初始化
balance := [5]float32{1:2.0,3:7.0}
多维数组
var variable_name [size1][size2]...[sizeN] variable_type
var threadim [5][10][4]int
初始化二维数组
a := [3][4]int{
{0,1,2,3},
{4,5,6,7},
{8,9,10,11},
}
注意:以上代码中倒数第二行的 } 必须要有逗号,因为最后一行的 } 不能单独一行,也可以写成这样:
a := [3][4]int{
{0, 1, 2, 3} ,/*第一行索引为 0 */
{4, 5, 6, 7} ,/*第二行索引为 1 */
{8, 9, 10, 11}}/* 第三行索引为 2 */
向函数传递数组
方式一
设置形参大小
void myFunction(param [10]int)
{
...
}
方式二
未设置数组大小
void myFunction(param []int)
{
...
}
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量