当前位置: 代码迷 >> 综合 >> golang(程序结构)
  详细解决方案

golang(程序结构)

热度:47   发布时间:2023-11-23 15:14:53.0

在这里插入图片描述

文章目录

  • 命名
  • 声明
  • 变量
  • 赋值
  • 类型
  • 包和文件
  • 作用域

命名

Golang中的关键字有25个,关键字不能用于自定义名字,只能在特定语法结构中使用
在这里插入图片描述
在这里插入图片描述
在习惯上要优先使用驼峰命名

声明

golang提供了四种类型的声明语句:var const type func

变量

  • 普通变量声明法:

var 变量名 类型 = 表达式

	//声明单个变量var s string = "hello"fmt.Print(s) // hello//声明多个变量var i,j,k int = 1,2,3fmt.Println(i,j,k) // 1 2 3//类型自动推导式声明var a,b,c = true,"hh",0.01fmt.Println(a,b,c) //true hh 0.01fmt.Printf("%T %T %T",a,b,c) // bool string float64
  • 懒汉声明法

变量名 := 表达式

	a,b,c := 1,true,"hhh"fmt.Println(a,b,c)fmt.Printf("%T %T %T",a,b,c) // bool string float64

赋值

这个语言有个特色,比如说元素交换可写成

x,y = y,x
a[i],a[j] = a[j],a[i]

同样,对于一个函数的返回,golang可以返回多个值

func test() (int,int,int) {
    return 1,2,3
}
func main(){
    x,y,z := test()fmt.Printf("%d %d %d",x,y,z) // 1 2 3
}

类型

type 类型名字 数据类型

	type myInt intvar a myInt = 10fmt.Print(a) // 10

包和文件

go的包结构很像java,只允许一个main方法,需要什么包,就自动添加进来,比如说我们写个温度转换的库

  • 在src下新建一个tempconv的包,新建一个tempconv.go文件,用来录入一些测试数据
package tempconvimport "fmt"//类型声明
type Celsius float64
type Fahrenheit float64//常量块声明
const(AbsoluteZero Celsius = -273.15FreezingC Celsius = 0BoilingC Celsius = 100
)//重写String接口方法
func (c Celsius) String() string {
    return fmt.Sprintf("%g°C",c)
}
//重写String接口方法
func (f Fahrenheit) String() string{
    return fmt.Sprintf("%g°F",f)
}
  • 在tempconv下新建一个文件conv.go,用来进行温度单位转换
package tempconv
// CToF converts a Celsius temperature to Fahrenheit.
func CToF(c Celsius) Fahrenheit {
     return Fahrenheit(c*9/5 + 32) }
// FToC converts a Fahrenheit temperature to Celsius.
func FToC(f Fahrenheit) Celsius {
     return Celsius((f - 32) * 5 / 9) }
  • 最后在src下的main包里的main.go文件里引用这个库
package mainimport ("fmt""golangStudy/src/tempconv"
)func main() {
    fmt.Println(tempconv.CToF(tempconv.BoilingC)) //212°F
}

作用域

  • 全局作用域与内部作用域
var g = "g"
func main() {
    f:="f"fmt.Println(g) //package-lever varfmt.Println(g) //local var
}
  • 函数词法作用域
    在函数中词法域可以深度嵌套,因此内部的?个声明可能屏蔽外部的声明。还有许多语法块是if或for等控制流语句构造的。下?的代码有三个不同的变量x,因为它们是定义在不同的词法域(这个例?只是为了演?作?域规则,但不是好的编程?格
func main() {
    x := "hello!" //函数体词法域for i := 0; i < len(x); i++ {
    x := x[i] //for循环隐式初始化词法域if x != '!' {
    x := x + 'A' - 'a'//for循环体词法域fmt.Printf("%c", x) // "HELLO" (one letter per iteration)}}
}