GO语言程序结构

Go语言是编译型的语言
package main //声明 包名
import “fmt” //声明 包
“os”
const boilingF = 212.0 //常量
func main() { //函数
var f = boilingF //变量
s := []int{1,2,3} //s[0] = 1
}
执行语句:go run main.go
编译生成二进制文件:go build main.go + ./main = go run main.go

关键字:break,go,else,if,var,return,switch,continue,import,const,map,package,type,struct,range,for等

变量(var)
声明形式:var name type = expression
i,j := 1,2 //:=表示声明,=表示赋值
i,j = j,i //交换i和j的值
以下几种声明变量的方式是等价的
s := “” //定义并赋值,显示的初始化说明初始化变量的重要性
var s string //隐式的初始化说明初始化变量不重要
var s = “”
var s string =""
var a,b,c = true,2.3,“four” //bool,float,string
var (
i = 100
j = “Tom”
k = 9.99
)

案例:
var i,j,k = 10,“Tom”,9.99
var ( i = 100 j = “Tom~” k = 9.99 )
fmt.Println(“i =”, i,“j =”, j,“k =”,k)
var (
s1 = “hello”
s2 = " world!"
)
var s3 = s1 + s2
fmt.Println("s3 = ",s3)
在这里插入图片描述在这里插入图片描述
基本数据类型
在这里插入图片描述
在这里插入图片描述
查看变量类型:
Printf是格式化,%T是任何值的类型,需要加\n是因为Printf没有自动换行,Println有自动换行
在这里插入图片描述

指针变量是存储值的地方,指针的值就是变量的地址§,一个指针指向变量值所保存的位置,&x(x的地址)获取一个指向变量的指针
x := 1 //定义并赋值
p := &x //p是整型指针,类型是*int,指向变量 x 指针的指向
fmt.Println(*p) //“1”
*p = 2 //等于 x = 2 改变了p所指向变量的值,但指针的值p没有变化,也就是指针的指向没有改变
fmt,Println(x) //结果"2"

常量(const):true,false,nil,iota
类型(type):int,int8,int16,int32,int64,unit…unit64,float32,float64,bool,byte,string,error等

函数(func):make,len,cap,new,copy,close,delete,complex,real,imag
new函数
使用new创建的变量和取其地址的普通局部变量没有不同,只是不需要声明一个虚拟的名字
表达式new(T)创建一个未命名的T类型变量,初始化为T类型的零值,并返回其地址(地址类型为*T)
p := new(int) //*int类型的指针p,指向未命名的int型变量
fmt.Println(*p) //输出0
*p = 2 //把未命名的int变量设置为2
fmt.Println(*p) //输出2
编译器可以选使用堆或栈上的空间来分配内存。在有逃逸情况时使用堆空间,没有逃逸情况使用栈。
var p *int
func f() {
var x int
x = 1
p = &x
}
变量x一定使用堆空间,f函数返回后还可以通过指针p访问,尽管x被声明为一个局部变量,p是全局的指针变量,此时我们说x从f逃逸
func g() {
y := new(int)
y = 1
}
g函数返回时,y变量变得不可访问,内存可以回收,因为
y没有从g函数中逃逸

类型声明
type name underlying-type
type Celsius float64
type FAh float64
即使使用相同的底层类型,他们也不是相同的类型,所以不能用作算术表达式或者合并
var c Celsius
var f FAh
fmt.Println(c == 0) //true
fmt.Println(f== 0) //true
fmt.Println(c == f ) //false
fmt.Println(c == Celsius(f)) //true 强转把变量f转换到Celsius类型


fmt包进行格式化
os包提供一些函数和变量
os.Args是一个字符串slice,可以理解成一个动态数组s,s[i]访问单个元素,通过s[m : n]访问连续子区间,数组长度len(s),len是函数,os.Args[1 :len(os.Args)]
Go中所有索引都是左闭右开区间s[m : n]表示从第m到n-1个元素的slice,如果m缺失默认0,n缺失默认len(s),所以可以简写为os.Args[1 : ]

for
for是Go里唯一循环语句
形式:for initialization;condition;post {
//语句
}
如果没有 initialization和post语句,分号可以省略,就变成了传统的while循环
for condition { //传统的while
}
三部分都是可以省略的
for { //传统的无限循环
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值