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变量。
原文地址:https://www.cnblogs.com/leisunny/p/14522757.html