Go的声明语法思想与规则

Go的声明语法思想与规则,第1张

1、C语言的声明语法

go语言的变量定义主要对照C语言,在C语言的基础上进行改进的。

C语言中的声明语法包括变量声明和函数声明两种,其规则分别如下:

变量声明

C语言中,变量的声明主要包含两个部分,放在左边的变量类型和放置在右边的变量名称,如基本数据类型、数组、指针等三种主要类型的定义如下:

int a;
int b[];
int *c;
函数声明

函数的声明包含返回变量类型、函数名称、输入参数三个部分,其声明格式为
返回变量类型 函数名称(输入参数类型 输入参数名称){},如:

int main(int argc,char \*argv[])
2、C语言的声明语法评价

C语言的声明方法是比较巧妙的,将类型放在左边直接代表声明变量,不需要增加额外的声明语法。

然而,在Go语言官方文档中详细总结了很多C语言声明的问题,并提出了go语言在声明语法中改进的思路。

其中,我认为C语言的声明语法其实问题并不多,其两点问题如下:

  • 1、变量名称和类型没有完全区分,如声明数组int a[]、指针数组 int *b[]等,这会导致声明语法不易阅读。

    并且导致理解容易混乱,同样是int类型,却可以定义整型、数组、指针等等。

    当前热门的java等都处理了这个问题,其变量的类型和名称是完全独立的,如数组定义写为int[] a = new int[];

  • 2、由于类型和声明语法的重用,代码中类型的解析比较困难。

    也会导致C、java语言中变量强制转换都会为类型加上括号等情况。

3、Go语言的声明语法 变量声明

Go语言在设计声明语法时主要考虑其易读性,符合阅读习惯,同样是第1节中的三种声明情况,在阅读可以表示为:

  • a: int
  • b: array[3] of int
  • c: pointer to int

其特点是类型在变量名之后,中间通过符号:表明在定义一个变量。

Go语言对其精炼修改,并将var作为语法声明关键字,得到其声明语法规则。

其基本数据类型、数组、指针等三种主要类型的定义如下:

var a int = 5
var b [3]int = []int{1,2,3}
var c *int = &a

也可以使用符号:替代var关键字,并默认进行类型推导:

a := 5
b := [3]int{1,2,3}
c := &a

可以看到Go语言的语法声明其实是比较易读的,特别是设计到复杂的一些类型,比如数组指针*[3]int,可以读作point to array[3] of int。

函数声明

Go语言的函数声明同样遵循变量声明的准则并利用func作为函数声明关键字,如:

func main(argc int, argv []string) int
4、Go语言变量声明测试代码 代码:

package main
import (
    "fmt"
    "unsafe"
)
// 变量定义测试
func main() {
    // 1、直接通过var关键字命名,如果未指定初值,go会为其附默认初值
    // 这和java是不同的,java的局部变量是必须附初值的,而静态变量和全局变量不需要,这和JVM处理有关系
    fmt.Println("**************************************************************************************************************")
    fmt.Println("1、直接通过var关键字命名,如果为指定初值,go会为其附默认初值")
    fmt.Println("这和java是不同的,java的局部变量是必须附初值的,而静态变量和全局变量不需要,这和JVM处理有关系")
    fmt.Println("")
    var i int = 11
    var ii int //会默认附初值
    fmt.Println("i =", i, "ii =", ii)
    fmt.Println("")
    // 2、自动类型推导
    fmt.Println("**************************************************************************************************************")
    fmt.Println("2、自动类型推导,不指定类型")
    fmt.Println("")
    var j = 11.34
    var k = "sddda"
    fmt.Println("j =", j)
    fmt.Println("k =", k)
    fmt.Println("")
    // 3、var省略 :=方式
    fmt.Println("**************************************************************************************************************")
    fmt.Println("3、省略var 通过:=方式定义并赋值")
    fmt.Println("")
    l := 3.4
    fmt.Println("l =", l)
    fmt.Println("")
    // 4、多变量命名(4种方式)
    fmt.Println("**************************************************************************************************************")
    fmt.Println("4、多变量命名(4种方式)")
    fmt.Println("①:var x1, x2, x3 int = 1, 2, 3")
    fmt.Println("②:var n1, n2, n3 = 1, 2, 3  省略类型")
    fmt.Println("③:m1, m2, m3 := 1, 2, 3  省略var")
    fmt.Println("")
    var x1, x2, x3 int = 1, 2, 3
    fmt.Println("x1 x2 x3=", x1, x2, x3)
    var n1, n2, n3 = 1, 2, 3
    fmt.Println("n1 n2 n3=", n1, n2, n3)
    m1, m2, m3 := 1, 2, 3
    fmt.Println("m1 m2 m3=", m1, m2, m3)
    var (
        l1 = 1
        l2 = 2
        l3 = 3
    )
    fmt.Println("l1 l2 l3=", l1, l2, l3)
    fmt.Println("")
    // 5、查看数据类型及其占用的字节数
    fmt.Println("**************************************************************************************************************")
    fmt.Println("5、查看数据类型及其占用的字节数")
    fmt.Println("通过Printf+\T方式输出类型,unsafe.Sizeof输入字节大小")
    fmt.Println("")
    q := -1.0
    fmt.Printf("q为%v,的类型是%T,占用%d个字节\n", q, q, unsafe.Sizeof(q))
    fmt.Println("")
}
输出

1、直接通过var关键字命名,如果为指定初值,go会为其附默认初值
这和java是不同的,java的局部变量是必须附初值的,而静态变量和全局变量不需要,这和JVM处理有关系
i = 11 ii = 0


2、自动类型推导,不指定类型
j = 11.34 k = sddda


3、省略var 通过:=方式定义并赋值
l = 3.4


4、多变量命名(4种方式)
①:var x1, x2, x3 int = 1, 2, 3
②:var n1, n2, n3 = 1, 2, 3 省略类型
③:m1, m2, m3 := 1, 2, 3 省略var

x1 x2 x3= 1 2 3
n1 n2 n3= 1 2 3
m1 m2 m3= 1 2 3
l1 l2 l3= 1 2 3


5、查看数据类型及其占用的字节数
通过Printf+\T方式输出类型,unsafe.Sizeof输入字节大小
q为-1,的类型是float64,占用8个字节

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/662499.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-18
下一篇 2022-04-18

发表评论

登录后才能评论

评论列表(0条)

保存