zoukankan      html  css  js  c++  java
  • Golang基础一之程序结构

    前言介绍
    与其他编程语言一样,Go语言中的大程序都从小的基本组件构建而来:变量存储值;简单表达式通过
    加和减等操作合并成大的;基本类型通过数组和结构体进行聚合;表达式通过if和for等控制语句来决定
    执行顺序;语句被组织成函数用于隔离和复用;函数被组织成源文件和包。
    
    声明
    go有四个主要声明:
    1.变量(var)
    2.常量(const)
    3.类型(type)
    4.函数(func)
    
    变量
    每一个声明有一个通用的形式:
    var name type = expression
    例如:
    var s string
    
    1.短变量声明
    name := expression
    
    2.指针
    指针的值是一个变量的地址。一个指针指示值所保存的位置。使用指针,可以在无须
    知道变量名字的情况下,间接读取或更新变量值
    例如:
    x := 1
    p := &x   //p是整型指针,指向x
    fmt.Println(p)  // "1"
    *p = 2    // x=2
    例2:
    func incr(p *int) int {
      *p++   //递增p所指向的值,p自身保持不变
      return *p
    }
    v := 1
    incr(&v)  // v=2
    fmt.Println(incr(&v)) // v=3
    
    3.new函数
    内置的new函数也可以进行变量的创建,初始化是为零值.
    例如:
    p := new(int) //*int类型的p,指向未命名的int变量
    fmt.Println(*p)  // 0
    *p = 2
    fmt.Println(*p)  // 2
    注意:在delta函数中,内置的new函数是不可用的
    
    
    赋值
    和其他语言赋值概念基本相同
    例:
    x = 1   // 有名称的变量
    *p = true   //间接变量
    person.name = "bob"  //结构体成员
    count[x] = count[x] * scale //数组或slice或map的元素。 ---》 count[x] *= scale
    
    多重赋值
    例1:计算斐波那契数列的第n个数
    func fib(n int) int {
      x, y := 0, 1
      for i:=0; i < n; i++{
        x, y = y, x+y
      }
      return x
    }
    
    可赋值性
    在程序中有很多地方是隐式赋值的
    例如:
    medals := []string{"gold", "silver", "bronze"}
    等同于
    medals[0] = "gold"
    medals[1] = "silver"
    medals[2] = "bronze"
    
    包和文件
    在go语言中包的作用和其他语言中的库或者模块作用类似,用于支持模块化、封装、编译隔离和重用。
    
    例:
    package main
    import (
    	"log"
    	"net/http"
    )
    
    func main() {
    	http.HandleFunc("/", handler_) // 回声请求调用处理程序
    	log.Fatal(http.ListenAndServe("localhost:8000", nil))
    }
    
    // 注意:如果导入的包未被使用,会触发错误,变量同理
    
    作用域
    声明的作用域是指用到声明时所声明名字的源代码段中,超出该作用域则不可用。
    
    例1:
    if f, err := os.Open(fname); err != nil {
      return err   // 编译错误:未使用f
    }
    f.Close()   //编译错误:未定义f
    
    改:
    if f, err := os.Open(fname); err != nil {
      return err   
    }else{
      f.Stat()
      f.Close()
    }
    
    例2:
    var cwd string
    
    func init() {
      cwd, err := os.Getwd()   // 编译会报错
      if err != nil {
        log. Fatalf("os.Getwd failed: %v", err)
      }
      log.Printf("working directory = %s", cwd)
    }
    
    改:
    var cwd string
    
    func init() {
      var err error
      cwd, err = os.Getwd()  
      if err != nil {
        log. Fatalf("os.Getwd failed: %v", err)
      }
    }
    原因:cwd和err在init函数块的内部都尚未声明,所以:=语句将它们都声明为局部变量。
    内层的cwd的声明让外部的声明不可见,所以这个语句没有按照预期更新包级别的cwd变量。
    
  • 相关阅读:
    MVC vs SVC
    迪米特原则与接口隔离原则
    依赖倒置原理:依赖、稳定的抽象层
    【调侃】IOC前世今生
    Visual SVN Server启动失败0x8007042a错误
    syntax error, unexpected '['
    navicat将多个表导出为一个sql文件
    我的flashfxp左右界面怎么变成这样了?
    什么是国际顶级域名?
    什么是A记录/CNAME记录/MX记录/TXT记录
  • 原文地址:https://www.cnblogs.com/leisunny/p/14522757.html
Copyright © 2011-2022 走看看