go学习(2)基础语法

1、标识符

标识符首字母大写:

      定义标识符如(常量、变量、类型、函数名、结构字段,接口)如果以一个大写字母开头,如:Group1,哪么使用这种形式

的标识符的对象就可以被外部包的代码所使用(要使用需要先导入这个包),这种定义被称为导出(如c++类的public)。

标识符首字母小写:

      以小写字母开头,则对包外是不可见的,但是在整个包的内部是可见可访问的(如c++类的protected)。

注意要分清是否跨包

2、例子

package main

//全小写,未导出
var x, y int
var (     // 这种因式分解关键字的写法一般用于声明全局变量
  a int
  b bool
)

//定义并赋值,多变量定义
var c, d int = 1, 2
var e, f = 123, "hello"

func main(){

  //下面这种变量的定义只能出现在函数体内,不能用来定义全局变量
  //自动推导变量的类型,用 := 来赋值,像c++的auto变量
  g, h:= 123, "hello"  

  //打印出来看看
  println(x, y, a, b, c, d, e, f, g, h)
}

3、全局变量允许声明但不使用

      局部变量声明了必须要使用,否则编译不过,局部变量不能重新声明。

      同一个包内全局变量不能重名

      pointer类型的默认值为nil

4、空白标识符 _ 也被用于抛弃值,如值5在:_,b = 5, 7 中被抛弃。这种主要用于函数返回多个值,只需要其中某个值。

      标识符 _ 实际上是一个只写变量,你不能得到它的值。这样做是因为go 语言中你必须使用所有被声明的变量。

 例:

func swap(x,y int){
  return y, x
}

func main(){
  a,b:=1,2
  _,b = swap(a,b)  //这里抛弃了a的值
}

5、常量可以用len(),cap(),unsafe.Sizeof()常量计算表达式的值。常量表达式中,函数必须是内置函数,否则编译不过:

package main

import "unsafe"
const (           //常量定义
  a = "abc"
  b = len(a)      //只有在常量中可以使用系统函数len()
  c = unsafe.Sizeof(a)
)

func main(){
  println(a, b, c)
}

6.iota 标识符

iota,特殊常量,可以认为是一个可以被编译器修改的常量。

在每一个const关键字出现时,被重置为0,然后再下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1。

代码:

package main

import "fmt"

func main(){
     const (
             a=iota      //0,const开始的第一个
             b           //1
             c           //2
             d = "ha"    //独立值,"ha"  iota += 1
             e           //"ha"  iota += 1
             f = 100     //100   iota += 1
             g           //100   iota += 1
             h = iota    //7,恢复计算
             i           //8
     )
     fmt.Println(a,b,c,d,e,f,g,h,i)  //0 1 2 ha ha 100 100 7 8
}

7、指针变量、变量地址

package main
import "fmt"

func main(){
  var a int = 4
  var b int32
  var c float32
  var ptr* int

  //运算符实例
  fmt.Printf("第1行 - a 变量类型为  = %T\n", a)
  fmt.Printf("第2行 - b 变量类型为  = %T\n", b)
  fmt.Printf("第3行 - c 变量类型为  = %T\n", c)

  // & * 运算符实例
  ptr = &a
  fmt.Printf("a 的值为 %d\n", a)
  fmt.Printf("*ptr 值为 %d\n", *ptr)
  
  a=5
  fmt.Printf("ptr 为 %d\n", ptr)
  fmt.Printf("*ptr 值为 %d\n", *ptr)
  
  *ptr=7
  fmt.Println(*ptr,a)  //7 7
}

8、if 不强制加括号

package main
import "fmt"

func main() {
  var a int = 100;

  if a < 20 {
     fmt.Printf("a 小于 20\n");
  } else if (a > 100) {   //括号可加可不加
     fmt.Printf("a > 100\n");
  } else {
     fmt.Printf("其它");
  }
}

9、for 循环

package main
import "fmt"

func main(){
  var b int = 15
  var a int
  numbers:= [6]int{1,2,3,5}   //数组,初始化

  for a:=0; a<10; a++ {
     fmt.Printf("a 的值为 %d\n", a)  //递增循环
  }

  for a< b {    //条件循环
    a++
    fmt.Printf("a 的值为 %d\n", a)
  }

  for i,x:= range numbers {  //range可以对 slice(切片)、map、数组,字符串等进行迭代循环
    fmt.Printf("第 %d位 x 的值 =%d\n", i,x)
  }

  for {
    fmt.Printf("无限循环")
  }
}

goto 不推荐使用

package main
import "fmt"
func main() {
  var a int = 10
  LOOP: for a < 20 {
    if a == 15 {
      a = a +1
      goto LOOP
    }

    fmt.Printf("a的值为:%d\n", a)
    a++
  }
}

10、函数

package main
import "fmt"

//函数 名称   参数列表          返回参数表
func   swap(x int, y string) (string, int) {
   return y, x
}

func swap1(x, y string) (string, string) {
   return y, x
}


func swap2(y string) string {
  return y
}

func main() {
   a, b:= swap(1, "test")
   fmt.Println(a, b)
}

11、闭包

package main
import "fmt"

func getSequence() func() int {  //返回值为一个函数
  i:= 0
  return func() int {  //内部函数,修改了临时变量 i的值
    i+=1
    return i
  }
}

func main() {
   //nextNumber 为一个函数, 函数 i 为 0
   
   nextNumber:= getSequence()
   fmt.Println(nextNumber())  //i=1
   fmt.Println(nextNumber())  //i=2
   fmt.Println(nextNumber())  //i=3  这里返回的函数nextNumber保存了内部变量i的值修改

   nextNumber1:= getSequence()
   fmt.Println(nextNumber1())  //i=1
   fmt.Println(nextNumber1())  //i=2
}

12、函数方法

package main
import "fmt"

//定义一个结构体
type Circle struct {
  radius float64
}

func main() {
  var c1 Circle
  c1.radius = 10.00
  fmt.Println("Area of Circle(c1) = ", c1.getArea())
}

//该方法 属于 Circle 类型对象中的方法,this Circle其中this类似于类的this指针
func (this Circle) getArea() float64 {
  return 3.14 * this.radius * this.radius
}

14、数组

package main

import "fmt"

func main() {
  var n [10] int   //定义一个长度为10的数组
  var i, j int

  //初始化数组元素
  for i=0; i<10; i++ {
     n[i] = i + 100      //设置元素为 i + 100
  }

  //输出每个数组元素的值
  for j = 0; j< 10; j++ {
    fmt.Printf("Element[%d] = %d\n", j, n[j])
  }

}

17、切片

package main

import "fmt"
func main() {
  var numbers = make([]int,3,5)
  printSlice(numbers)
  s:=[]int {1,2,3}
  printSlice(s)
  
  var numbers1 []int
  printSlice(numbers1)
  if (numbers1== nil) {
    fmt.Println("切片是空的")
  }

  fmt.Println("s[1:3] ==", s[1:3]) //打印切片从索引1(包含)到索引3(不包含)的值
  fmt.Println("s[:3] ==", s[:3])   //默认从下限0开始打印
  fmt.Println("s[2:] ==", s[2:])   //默认上限为0,从索引2(包含)开始打印

  numbers=append(numbers,0,1,2,3,4,5,6)  //追加
  fmt.Println(numbers,cap(numbers))

  //创建切片 numbersc 是之前切片的两倍容量
  numbersc:= make([]int, len(numbers), (cap(numbers))*2)

  //拷贝 numbers 的内容到 numbersc
  copy(numbersc,numbers)
  fmt.Println(numbersc)
}

func printSlice(x[] int) {
  fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}

18、map

package main

import "fmt"
func main() {
  var countryCapitalMap map[string]int      //key:string value:int
  countryCapitalMap = make(map[string]int)  //创建map

  //map插入值
  countryCapitalMap["France"] = 1
  countryCapitalMap["Italy"] = 2
  countryCapitalMap["Japan"] = 3
  countryCapitalMap["India"] = 4
  
  delete(countryCapitalMap,"India");  //删除key
 
  //遍历
  for key,val:= range countryCapitalMap {
    fmt.Println("capital of %s num:%d\n", key,val)
  }

  //查看是否存在
  captial, ok:= countryCapitalMap["United States"]
  
  if (ok) {
    fmt.Println("Capital of United States is", captial)
  }else {
    fmt.Println("Capital of United States is not Find")
  }
}

19、接口

package main

import "fmt"

//定义一个接口
type Phone interface {
  call()
}

type NokiaPhone struct {  //诺基亚
}

func (nokia NokiaPhone) call() {   //实现call接口方法
  fmt.Println("I am Nokia, I can call you!")
}

type IPhone struct {  //苹果
}

func (iPhone IPhone) call() {  //实现call接口方法
  fmt.Println("I am iPhone, I can call you!")
}

func main() {
  var phone Phone
  phone = new(NokiaPhone)
  phone.call()

  phone = new(IPhone)
  phone.call()
}

猜你喜欢

转载自blog.csdn.net/ltk80/article/details/82900749