go语言学习第一天==》 语言特性

go语言学习第一天==》 语言特性

  • 语言特性
    go 语言是一门静态类型的开发语言
    //
    1自动垃圾回收
    不支持的语言写法C++↓
void foo() { 
 char* p = new char[128];  ... // 对p指向的内存块进行赋值  
func1(p); // 使用内存指针 
 
 delete[] p;
  }


2更丰富的内置类型
布尔类型:bool
整型:int8(等效byte)、 int16 、int(随系统位变化) 、uint(无符号整型)、uintptr(同指针)等
浮点类型:float32、float64
复数类型:complex64、complex128
字符串:string
字符类型:rune
错误类型:error
此外还还支持复合类型:
指针(pointer)
数组(array)
切片(slice 通常指数组切片类似python里面的切片)
字典(map)
通道(chan)
结构体(struct)
接口(interface)

///
3 函数多返回值
demo:

func getName()(firstName, middleName, lastName, nickName string){     						
firstName = "May"     
middleName = "M"     
lastName = "Chen"     
nickName = "Babe"     
return 
} 

调用

fn, mn, ln, nn := getName()

如果只需要nickName则

_, _, _, nn := getName()

注:并不是每一个返回值都必须赋值,没有被明确赋值的返回值将保持默认的空值。

/
4 错误处理:go语言引入了defer 、panic、recover来处理错误(摒弃了一层一层的try-catch)


5 匿名函数和闭包
go中所有函数也是值类型,它支持常规的匿名函数和闭包,可以随意对匿名函数变量进行传递和调用
demo

f := func(x, y int) int {     
 return x + y  
} 

///
6接口和类型
C++中接口和类型的关系确定
demo:

// 抽象接口 interface IFly {  virtual void Fly()=0; }; 
 
// 实现类 
class Bird : public IFly { 
 public:     
  Bird() {}    
  virtual ~Bird() {} 
  public:  
   void Fly()      {       // 以鸟的方式飞行      }  
 };    
 void main()  {    
   IFly* pFly = new Bird();   
   pFly->Fly();      
   delete pFly; 
  } 

显然C++,在实现一个接口之前必须先定义接口并且将类型和接口紧密绑定(修改接口会影响到所有实现了改接口的类型)
然而go

type Bird struct {  
... 
} 
 
func (b *Bird) Fly() {        
  // 以鸟的方式飞行
 } 

我们在实现Bird类型是完全没有任何IFly的信息。我们可以另外一个地方定义IFly接口:

type IFly interface {     
 Fly() 
} 
//这两者目前看起来完全没有关系,现在看看我们如何使用它们: 
func main() {  
 var fly IFly = new(Bird)     
 fly.Fly() 
 }


7并发编程
Go语言引入了goroutine概念,它使得并发编程变得非常简单。通过使用goroutine而不是裸用 操作系统的并发机制,以及使用消息传递来共享内存而不是使用共享内存来通信,Go语言让并 发编程变得更加轻盈和安全。


8反射
通过反射,你可以获取对 象类型的详细信息,并可动态操作对象。反射是把双刃剑,功能强大但代码可读性并不理想。若 非必要,并不推荐使用反射。
反射常见的使用场景是做对象的序列化(serialization,有时候也叫Marshal & Unmarshal)。 例如,Go语言标准库的encoding/json、encoding/xml、encoding/gob、encoding/binary等包就大量 依赖于反射功能来实现。

demo:可以利用反射功能列出某个类型中所有成员变量的值

package main 
 
import (       
  "fmt"     
  "reflect" 
 ) 
 
type Bird struct { 
  Name string     
  LifeExpectance int 
} 
 
func (b *Bird) Fly() {    
 fmt.Println("I am flying...") 
} 
 
func main() {     
 sparrow := &Bird{"Sparrow", 3}     
 s := reflect.ValueOf(sparrow).Elem()     
 typeOfT := s.Type()     
 for i := 0; i < s.NumField(); i++ {         
   f := s.Field(i)         
   fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(),     f.Interface())     
  } 
} 


该程序的输出结果为:
0: Name string = Sparrow
1: LifeExpectance int = 3

/
9语言交互性
go语言可以重用现有c模块,其功能被命名为cgo与java中的jni有所不同
demo go调用c语言标准库中的puts函数

package main 
 
/* #include <stdio.h> */ 
import "C" 
import "unsafe" 
 
func main() {     
  cstr := C.CString("Hello, world")     
  C.puts(cstr)     
  C.free(unsafe.Pointer(cstr)) 
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值