一.循环:
Go语言中只有for,以下是for的三种使用方式。
package main
import "fmt"
func sum(args ...int) (value int) {
//3.
for _, data := range args {
value += data
}
return
}
func main() {
//1.
for{
fmt.Print("你好!\n")
}
//2.
for i := 0; i < 10; {
i++
fmt.Printf("%d\n", i)
}
value := sum(1, 3, 5)
fmt.Printf("%d\n", value)
}
注意:
- 使用range关键字会返回两个数,第一个是下标,第二个是下标对应的数据;而无需使用的值可是使用_来接受接收。
- 还可以使用len函数来得到集合中存储元素的个数,然后使用for循环通过下标进行遍历。另外,使用len函数还可以获得字符串中的字符个数。
二.不定参数列表以及函数嵌套调用:
不定参数的函数嵌套调用的情况:
package main
import "fmt"
func sum1(args ...int) (value int){
//不定参调用时需要些 ... 作为传参格式
sum2(args ...)
sum2(args[0], args[1], args[2])
//不定参 部分传参
sum2(args[0:4] ...)
sum2(args[:4] ...)
sum2(args[0:] ...)
return
}
func sum2(args ...int) (value int){
return
}
func main() {
value := sum1(1, 3, 5, 7, 9)
fmt.Printf("%d\n", value)
}
type定义函数类型:
package main
import "fmt"
//type定义函数类型
type functype func(int, int) int
func demo (int, int) int{
return 0
}
func main() {
//1.var f functype = demo
//2.通过自动类型推导创建函数类型
f := demo//注意:此处没有调用函数,是将地址付给函数指针f
v := f(1, 2)//此时已经调用了函数,将函数的返回值赋值给变量v
fmt.Printf("%T\n", f)
fmt.Printf("%d\n", v)
}
需要注意的是,不同类型的函数函数指针之间不能赋值。
注意:Go全局变量不能使用自动类型推导进行赋值。
package main
import "fmt"
a := 10
func main() {
fmt.Printf("%d", a)
}
三.匿名函数:
package main
import "fmt"
func main() {
a := 10
b := 20
v := func(a int, b int) int {
return a + b
}(a, b)
f := func(a int, b int) int {
return a + b
}
//v:函数的返回值
fmt.Printf("%d\n", v)
//f:函数指针
fmt.Printf("%p\n", f)
}
四.无条件跳转语句 goto:
在C语言中,可以使用while for goto 来制造死循环。在Go语言中没有while。以下是在Go中使用goto语句制造的循环,可以使用另一个goto来跳出循环,也可以使用return来结束循环。
在实际开发中,应该注意goto的使用,因为goto可能会使一个函数与另一个函数建立联系,这样会破坏程序的耦合性。
package main
import "fmt"
func main(){
i := 1
fmt.Println("1")
fmt.Println("2")
HERE:
fmt.Println("3")
fmt.Println("4")
i++
if i == 10{
//return;
goto END
}
goto HERE
END:
fmt.Println("5")
fmt.Println("6")
}
需要注意的是:
- C语言中允许使用goto从一个循环跳入另一个循环,但是Go语言中只可以使用goto跳出跳出循环,并不能进入另一个循环。
- C语言中使用goto从一个循环跳入另一个循环时,要注意需要使用的变量要声明在第一个循环变量之前,比如第二个循环的循环变量,否则使用了在被跳过的部分定义的数据是就会出现错误。
五.C语言、Go语言中栈的大小:
- 在调用函数、接收实参、定义变量时,都会占用栈的空间(printf函数会在调用完成后释放,所以可以不用考虑在内)。
- 在C语言中,栈区系统开辟的空间大小为1MB(可以开辟数组进行测试),在window环境下可以扩展为10MB,Linux下可以扩展为16MB。
- Go语言对堆区和栈区进行了封装,所以在栈中也可以开辟足够大的空间(还可以对C语言中的mollac函数、Go中的栈进行测试,mollac函数可以开辟的空间必须是连续的,可以打开管理器查看剩余的内存大小作为参考,本次测试8G内存剩余3.2G开辟了1G左右的空间;而Go语言中的栈可以提供10亿B的空间)。
六.C语言中的const和Go语言中的常量:
- C语言中使用const修饰的变量本质上是只读变量,可以通过指针对其进行修改。
- Go语言对常量的地址进行了封装,使得程序员不能获得常量的地址,对常量进行取地址运算时就会报错(如果使用工具也是可以得到的)。所以Go语言中的常量是相对安全的。