百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

golang基础教程

toyiye 2024-06-21 12:00 10 浏览 0 评论

1. hello-world

package main
import "fmt"

func main(){
fmt.Println("Hello world, Go Go!");
fmt.Printf("type of Hello is %T\n", "Hello")
}

package main--每一个Go文件都应该在开头进行package name的声明(注:只有可执行程序的包名为main)。包用于代码的封装与重用,这里包名为main。位于第一行。

import "fmt"--导入fmt包,下面代码要使用。

2. 注释

单行注释://

多行注释:/* */

3. 空白符

_在Go中被用作空白符,可以表示任何类型的任何值。

4. 类型

布尔:bool // true,false

字符串:string

数字类型:int8,int16,int32,int64,int

uint8,uint16,uint32,uint64,uint

float32,float64

complex64,complex128

byte

rune

注:int,根据不同的底层平台,表示32或64位整型。除非对整形的大小有特定的需求,否则通常应该使用int表示整型。

注:byte是uint8的别名,rune是int32的别名。

注:+操作符用于拼接字符串。

5. 类型转换

Go有着非常严格的强类型特征,没有自动类型提升或类型转换,不允许将一种类型的变量赋值给另一种类型的变量。

若要类型转换,需要显式类型装换,如int(f)等。

i := 60.5
j := 50
sum := i + float64(j)

自声明类型也不能和相同原类型混合使用:

    var str string = "Hello"
    type myString string
    var customName myString = "world"
    customName = str  // 不允许

6. 格式说明符

%T:打印变量的类型

%v:打印变量的值

fmt.Printf("type of sum is %T\n", sum)

7. sizeof

Go的unsafe包提供一个Sizeof函数,该函数接收变量并返回它的字节大小。unsafe包应该小心使用,因为使用unsafe包可能带来可移植性问题。

8. 变量

var name type
name = initalvalue
var name type = initalvalue
var name = initalvalue  // 类型推断
var name1, name2 type = initalvalue1, initalvalue2
var (
name1 = initalvalue1
name2 = initalvalue2
)   // 一条语句声明不同类型变量
name := initalvalue   // 简短声明用:=

注:简短声明要求:=操作符左边的所有变量都要有初始值;要求:=操作符的左边至少有一个变量是尚未声明的。

注意:go语言中定义的变量必须被用到,否则会报错。

9. 常量

双引号中的任何值都是Go中的字符串常量。

无类型的常量有一个与它们相关联的默认类型,并且当且仅当一行代码需要时才提供它。在声明中 var name = "Sam" , name需要一个类型,它从字符串常量 Sam 的默认类型中获取。

const a = 5
var intVar int = a
var int32Var int32 = a
var float64Var float64 = a
var complex64Var complex64 = a
fmt.Println("intVar", intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var", complex64Var)

a 的值是 5 ,a 的语法是通用的(它可以代表一个浮点数、整数甚至是一个没有虚部的复数),因此可以将其分配给任何兼容的类型。这些常量的默认类型可以被认为是根据上下文在运行中生成的。 var intVar int = a 要求 a 是 int,所以它变成一个 int 常量。 var complex64Var complex64 = a 要求 a 是 complex64,因此它变成一个复数类型。

10. 函数

func functionname(parametername1 type, parametername1 type) returntype {  
    // 函数体(具体实现的功能)
}

如果有连续若干个参数,它们的类型一致,那么我们无须一一罗列,只需在最后一个参数后添加该类型。

从函数中可以返回一个命名值。一旦命名了返回值,可以认为这些值在函数第一行就被声明为变量了。

func rectProps(length, width float64)(area, perimeter float64) {  
    area = length * width
    perimeter = (length + width) * 2
    return // 不需要明确指定返回值,默认返回 area, perimeter 的值
}

11. 包

包用于组织Go源代码,提供了更好的可重用性和可读性。

属于某一个包的源文件都应该放置于一个单独命名的文件夹里。按照 Go 的惯例,应该用包名命名该文件夹。

导出名字

在 Go 中,任何以大写字母开头的变量或者函数都是被导出的名字。其它包只能访问被导出的函数和变量。

init函数

所有包都可以包含一个 init 函数。init 函数不应该有任何返回值类型和参数,在我们的代码中也不能显式地调用它。init 函数的形式如下:

func init() {  
}

init 函数可用于执行初始化任务,也可用于在开始执行之前验证程序的正确性。

包的初始化顺序

首先初始化包级别(Package Level)的变量

紧接着调用 init 函数。包可以有多个 init 函数(在一个文件或分布于多个文件中),它们按照编译器解析它们的顺序进行调用。

如果一个包导入了另一个包,会先初始化被导入的包。尽管一个包可能会被导入多次,但是它只会被初始化一次。

空白标识符

导入了包,却不在代码中使用它,这在 Go 中是非法的。有两种处理方法:

1)错误屏蔽器。在导入包后,用空白符引用包的变量。var _ = rectangle.Area

2)导入包语句前使用空白符。_"geometry/rectangle"

12. 条件判断

if condition {  
} else if condition {
} else {
}

if statement; condition {  
}

注:else 语句应该在 if 语句的大括号 } 之后的同一行中。如果不是,编译器会不通过。

13. 循环

for是Go语言中唯一的循环语句。Go中没有while和do while循环。

for initialisation; condition; post {  
}

其中initialization和post可以省略,而只使用condition

for i <= 10 { //semicolons are ommitted and only condition is present
   fmt.Printf("%d ", i)
   i += 2
}

若condition也省略则表示无限循环。

14. switch

基础用法和C语言相似,包含switch…case…case…default。

通过用逗号分隔,可以在一个 case 中包含多个表达式。 case 1,2, 3, 4, 5:

switch中表达式可省略。如果省略表达式,则表示这个 switch 语句等同于 switch true,并且每个 case 表达式都被认定为有效,相应的代码块也会被执行。

    num := 75
    switch { // 表达式被省略了
    case num >= 0 && num <= 50:
        fmt.Println("num is greater than 0 and less than 50")
    case num >= 51 && num <= 100:
        fmt.Println("num is greater than 51 and less than 100")
    case num >= 101:
        fmt.Println("num is greater than 100")
    }

在 Go 中,每执行完一个 case 后,会从 switch 语句中跳出来,不再做后续 case 的判断和执行。使用 fallthrough 语句可以在已经执行完成的 case 之后,把控制权转移到下一个 case 的执行代码中。

    switch num := number(); { // num is not a constant
    case num < 50:
        fmt.Printf("%d is lesser than 50\n", num)
        fallthrough
    case num < 100:
        fmt.Printf("%d is lesser than 100\n", num)
        fallthrough
    case num < 200:
        fmt.Printf("%d is lesser than 200", num)
    }

fallthrough 语句应该是 case 子句的最后一个语句。如果它出现在了 case 语句的中间,编译器将会报错:fallthrough statement out of place

相关推荐

CryptoChat:一款功能强大的纯Python消息加密安全传输工具

关于CryptoChatCryptoChat是一款功能强大的纯Python消息加密安全传输工具,该工具专为安全研究专家、渗透测试人员和红蓝队专家设计,该工具可以完全保证数据传输中的隐私安全。该工具建立...

为什么都说Python简单,但我觉得难?

Python普遍被大家认为是编程语言中比较简单的一种,但有一位电子信息的学生说自己已经学了C语言,但仍然觉得Python挺难的,感觉有很多疑问,像迭代器、装饰器什么的……所以他提出疑问:Python真...

蓝牙电话-关联FreeSwitch中继SIP账号通过Rest接口

蓝牙电话-关联FreeSwitch中继SIP账号通过Rest接口前言上一篇章《蓝牙电话-与FreeSwitch服务器和UA坐席的通话.docx》中,我们使用开源的B2B-UA当中经典的FreeSWIT...

技术分享|Sip与WebRTC互通-SRProxy开源库讲解

SRProxy介绍目前WebRTC协议跟SIP协议互通场景主要运用在企业呼叫中心、企业内部通信、电话会议(PSTN)、智能门禁等场景,要想让WebRTC与SIP互通,要解决两个层面的...

全网第N篇SIP协议之GB28181注册 JAVA版本

鉴于网上大部分关于SIP注册服务器编写都是C/C++/python,故开此贴,JAVA实现也贴出分享GB28181定义了了基于SIP架构的视频监控互联规范,而对于多数私有协议实现的监控系统...

「linux专栏」top命令用法详解,再也不怕看不懂top了

在linux系统中,我们经常使用到的一个命令就是top,它主要是用来显示系统运行中所有的进程和进程对应资源的使用等信息,所有的用户都可以使用top命令。top命令内容量丰富,可令使用者头疼的是无法全部...

Linux 中借助 perf 对 php 程序模拟CPU高的案例分析

导语本文是一篇Linux借助工具分析CPU高的优化案例,没有任何干货内容,很详细的展示了优化CPU高的具体步骤,非常适合初中级读者阅读!...

centos漏洞处理方法(centos podman)

centos服务器最近有诸多漏洞,修复命令及对应的漏洞整理后,分享给大家RHSA-2020:1176-低危:avahi安全更新yumupdateavahi-libsRHSA-2017:326...

Linux上的free命令详解(Buffer和Cache)

解释一下Linux上free命令的输出。下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(FreeOutput)。例如:FO[2][1]...

linux 命令行之你真的会用吗?--free 基本用法篇

free命令行统计内存使用率及swap交换分区的使用率数据。是由sourceforge负责维护的,在ubuntu上其包名为procps,这个源码包中,除了free还有ps,top,vmstat,ki...

kong api gateway 初体验(konga github)

kongapigateway初体验(firstsight?)。Kong是一个可扩展的开源API层(也称为API网关或API中间件)。Kong运行在任何RESTfulAPI的前面,并通过插件...

在Ubuntu下开启IP转发的方法(ubuntu20 ip)

IP地址分为公有ip地址和私有ip地址,PublicAddress是由INIC(internetnetworkinformationcenter)负责的,这些IP地址分配给了注册并向INIC提...

基于 Kubernetes 的 Serverless PaaS 稳定性建设万字总结

作者:许成铭(竞霄)数字经济的今天,云计算俨然已经作为基础设施融入到人们的日常生活中,稳定性作为云产品的基本要求,研发人员的技术底线,其不仅仅是文档里承诺的几个九的SLA数字,更是与客户切身利益乃...

跟老韩学Ubuntu Linux系列-sysctl 帮助文档

sysctl一般用于基于内核级别的系统调优,man帮助手册如下。...

如何在 Linux/Unix/Windows 中发现隐藏的进程和端口

unhide是一个小巧的网络取证工具,能够发现那些借助rootkit、LKM及其它技术隐藏的进程和TCP/UDP端口。这个工具在Linux、UNIX类、MS-Windows等操作系统下都...

取消回复欢迎 发表评论:

请填写验证码