首页 > 其他分享 >go 基础结构和基本数据类型

go 基础结构和基本数据类型

时间:2023-01-15 21:13:46浏览次数:59  
标签:pack1 函数 数据类型 类型 使用 go main 标识符 结构

Go 的源文件以 .go 为后缀名存储在计算机中,这些文件名均由小写字母组成,如 scanner.go 。如果文件名由多个部分组成,则使用下划线 _ 对它们进行分隔,如 scanner_test.go 。文件名不包含空格或其他特殊字符。

有效的标识符必须以字母(可以使用任何 UTF-8 编码的字符或 _)开头,然后紧跟着 0 个或多个字符或 Unicode 数字,如:X56、group1、_x23、i、өԑ12。

以下是无效的标识符:

  • 1ab(以数字开头)
  • case(Go 语言的关键字)
  • a+b(运算符是不允许的)

_ 本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。

示例:

package main

import "fmt"

func main() {
    fmt.Println("hello, world")
}

包的概念、导入与可见性

如同其它一些编程语言中的类库或命名空间的概念,每个 Go 文件都属于且仅属于一个包。一个包可以由许多以 .go 为扩展名的源文件组成,因此文件名和包名一般来说都是不相同的。

你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package mainpackage main 表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。

一个应用程序可以包含不同的包,而且即使你只使用 main 包也不必把所有的代码都写在一个巨大的文件里:你可以用一些较小的文件,并且在每个文件非注释的第一行都使用 package main 来指明这些文件都属于 main 包。如果你打算编译包名不是为 main 的源文件,如 pack1,编译后产生的对象文件将会是 pack1.a 而不是可执行程序。另外要注意的是,所有的包名都应该使用小写字母。

属于同一个包的源文件必须全部被一起编译,一个包即是编译时的一个单元,因此根据惯例,每个目录都只包含一个包。如果对一个包进行更改或重新编译,所有引用了这个包的客户端程序都必须全部重新编译。

如果需要多个包,它们可以被分别导入:

import "fmt"
import "os"
import (
   "fmt"
   "os"
)

可见性规则

当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是它们在整个包的内部是可见并且可用的(像面向对象语言中的 private )。因此,在导入一个外部包后,能够且只能够访问该包中导出的对象。

假设在包 pack1 中我们有一个变量或函数叫做 Thing(以 T 开头,所以它能够被导出),那么在当前包中导入 pack1 包,Thing 就可以像面向对象语言那样使用点标记来调用:pack1.Thing(pack1 在这里是不可以省略的)。

因此包也可以作为命名空间使用,帮助避免命名冲突(名称冲突):两个包中的同名变量的区别在于它们的包名,例如 pack1.Thing 和 pack2.Thing

函数

这是定义一个函数最简单的格式:

func functionName()

main() 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。如果你的 main 包的源代码没有包含 main() 函数,则会引发构建错误 undefined: main.mainmain() 函数既没有参数,也没有返回类型(与 C 家族中的其它语言恰好相反)。如果你不小心为 main() 函数添加了参数或者返回类型,将会引发构建错误:

func main must have no arguments and no return values results.

符合规范的函数一般写成如下的形式:

func functionName(parameter_list) (return_value_list) {
   …
}

类型

使用 var 声明的变量的值会自动初始化为该类型的零值。

类型可以是基本类型,如:intfloatboolstring;结构化的(复合的),如:structarray、切片 (slice)、map、通道 (channel);只描述类型的行为的,如:interface

结构化的类型没有真正的值,它使用 nil 作为默认值(在 Objective-C 中是 nil,在 Java 中是 null,在 C 和 C++ 中是 NULL 或 0)。值得注意的是,Go 语言中不存在类型继承。

函数也可以是一个确定的类型,就是以函数作为返回类型。这种类型的声明要写在函数名和可选的参数列表之后,例如:

func FunctionName (a typea, b typeb) typeFunc

你可以在函数体中的某处返回使用类型为 typeFunc 的变量 var

return var

一个函数可以拥有多返回值,返回类型之间需要使用逗号分割,并使用小括号 () 将它们括起来,如:

func FunctionName (a typea, b typeb) (t1 type1, t2 type2)

类型转换

在必要以及可行的情况下,一个类型的值可以被转换成另一种类型的值。由于 Go 语言不存在隐式类型转换,因此所有的转换都必须显式说明,就像调用一个函数一样(类型在这里的作用可以看作是一种函数):

valueOfTypeB = typeB(valueOfTypeA)

类型 B 的值 = 类型 B(类型 A 的值)

a := 5.0
b := int(a)

但这只能在定义正确的情况下转换成功,例如从一个取值范围较小的类型转换到一个取值范围较大的类型(例如将 int16 转换为 int32)。当从一个取值范围较大的转换到取值范围较小的类型时(例如将 int32 转换为 int16 或将 float32 转换为 int),会发生精度丢失(截断)的情况。当编译器捕捉到非法的类型转换时会引发编译时错误,否则将引发运行时错误。

标签:pack1,函数,数据类型,类型,使用,go,main,标识符,结构
From: https://www.cnblogs.com/dadishi/p/17054135.html

相关文章

  • Go语言学习之 Day02
    数组赋值二维数组切片切片操作slice内存slice切片操作slice元素删除点击查看代码1.所有资料,上课代码,同学作业=>githubweb链接:https://git......
  • Go语言学习之 Day03
    网络编程TCP服务器/客户端开发UDP服务器/客户端开发命令行聊天室web开发HTTP协议web应用开发客户端开发Web爬虫HTML结构GoqueryRPC......
  • Go语言学习之 Day06
    文件操作读文件:Open:打开文件并返回文件对象指针写文件:Create:创建文件并返回文件对象指针(文件不存在则创建,文件存在则清空)追加文件:OpenFile:按指定权限打开文件,并返回文......
  • Go语言学习之 Day07
    Go学习day07接口接口是自定义类型,是对是其他类型行为的抽象定义:接口定义使用interface标识,声明了一系列的函数签名(函数名、函数参数、函数返回值),在定义接口时可......
  • Go语言学习之 Day04
    函数函数-定义&调用函数包含函数名、行参列表、函数体和返回值列表,使用func进行声明,函数无参数或返回值时则形参列表和返回值列表省略funcname(parameters)return{......
  • golang 为图片加水印
    前段时间一个需求涉及到给图片加水印,考虑图片安全性,决定放在后端加水印。记录一下代码。思路思路是先为水印文字生成一个仅包含水印文字的图片,把这个图片倾斜一定角度(......
  • GO map按某字段排序
    packagemainimport("fmt""sort")typefrequencystruct{charstringfreint}funcfrequencies(sstring)[]frequency{m:=make(map[string]int)f......
  • (转)Golang - new和make的使用和区别(示例详解)
    原文:https://www.cnblogs.com/beatleC/p/16081832.html前言:Go语言中new和make是内置函数,主要用来创建分配类型内存(相同点:堆上),其功能相似,却有本质区别。引入:变量的声明v......
  • Go内存逃逸
    前言很久以前就听过过内存逃逸这个词,最近了解了一下,才发现是个很简单的概念.只要把前言部分看完,就已经了解了.来吧...在介绍内存逃逸之前,我们先用C语言来引出......
  • (转)golang 函数
    原文:https://www.cnblogs.com/duoke360/p/15663943.htmlgolang函数简介函数的go语言中的一级公民,我们把所有的功能单元都定义在函数中,可以重复使用。函数包含函数的名称......