Go语言基础(二)

本文介绍了Go语言的基础知识,包括for循环的三种形式,如何使用range和len函数,以及不定参数列表和函数嵌套调用的规则。同时,文章探讨了匿名函数、无条件跳转语句goto的使用,强调了在Go中全局变量不支持类型推导。此外,对比了C语言和Go语言中栈的大小限制,并分析了C语言const与Go语言常量的区别,指出Go语言常量的安全性更高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.循环:

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)

}

注意:

  1. 使用range关键字会返回两个数,第一个是下标,第二个是下标对应的数据;而无需使用的值可是使用_来接受接收。
  2. 还可以使用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")
}

需要注意的是:

  1. C语言中允许使用goto从一个循环跳入另一个循环,但是Go语言中只可以使用goto跳出跳出循环,并不能进入另一个循环。
  2. C语言中使用goto从一个循环跳入另一个循环时,要注意需要使用的变量要声明在第一个循环变量之前,比如第二个循环的循环变量,否则使用了在被跳过的部分定义的数据是就会出现错误。

五.C语言、Go语言中栈的大小:

  1. 在调用函数、接收实参、定义变量时,都会占用栈的空间(printf函数会在调用完成后释放,所以可以不用考虑在内)。
  2. 在C语言中,栈区系统开辟的空间大小为1MB(可以开辟数组进行测试),在window环境下可以扩展为10MB,Linux下可以扩展为16MB。
  3. Go语言对堆区和栈区进行了封装,所以在栈中也可以开辟足够大的空间(还可以对C语言中的mollac函数、Go中的栈进行测试,mollac函数可以开辟的空间必须是连续的,可以打开管理器查看剩余的内存大小作为参考,本次测试8G内存剩余3.2G开辟了1G左右的空间;而Go语言中的栈可以提供10亿B的空间)。

六.C语言中的const和Go语言中的常量:

  1. C语言中使用const修饰的变量本质上是只读变量,可以通过指针对其进行修改。
  2. Go语言对常量的地址进行了封装,使得程序员不能获得常量的地址,对常量进行取地址运算时就会报错(如果使用工具也是可以得到的)。所以Go语言中的常量是相对安全的。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值