Java与Go差别在哪,谁要被时代抛弃?
public static String toString(int num) {int data = num;return String.valueOf(num);}
func toString(num int) string {data := num // data没有使用者,无法编译return strconv.Itoa(num)}func toString(num int) string {_ := num // 正常编译return strconv.Itoa(num)}
public void compareVariable() {int age;Object object;System.out.println(age); // 编译错误System.out.println(object); // 编译错误}
func compareVariable() {var age intvar hashMap *map[string]intfmt.Println(num) // num = 0fmt.Println(hashMap) // &hashMap== nil}
if _, ok := conditionMap["page"]; ok {//}
// User 定义User结构体type User struct {Name stringAge int}// 使用一个结构体func main() {personPoint := new(User) // 通过new方法创建结构体指针person1 := User{} // 通过Person{}创建默认字段的结构体person2 := User{Name: "xiaoHong",Age: 21,}fmt.Println(personPoint) // &{ 0 }fmt.Println(person1) // { 0 }fmt.Println(person2) // {xiaoHong 21 }}
class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public int getAge() { return age; } public String print() { return "{name = " + name + ",age = " + age + "}"; }}public class Demo { public static void main(String[] args) { User user = new User("xiaohong", 29); System.out.println("user信息:" + user.print()); }}//执行结果user信息:{name = xiaohong,age = 29}package entityimport "fmt"type User struct {Name stringAge int}// User结构体/指针可调用的"方法",属于User结构体func (user *User) Solve() {fmt.Println(user)}// 任何地方都可调用的"函数",不属于任何结构体,可通过entity.Solve调用func Solve(user *User) {fmt.Println(user)}func main() {userPoint := new(entity.User) // 通过new方法创建结构体指针entity.Solve(userPoint) // 函数调用userPoint.Solve() // 方法调用}
public static void main(String[] args) {int[] array = {1, 2, 3};change(array);System.out.println(Arrays.toString(array)); // -1,2,3}private static void change(int[] array) {array[0] = -1;}
// 不限定长度(即slice):func main() {var array = []int{1, 2, 3}change(array)fmt.Println(array) // [-1 2 3]}func change(array []int) {array[0] = -1}// 限定长度(即数组):func main() {var array = [3]int{1, 2, 3}change(array)fmt.Println(array) //[1 2 3]}func change(array [3]int) {array[0] = -1}
//User 定义User结构体type User struct { Name string Age int}// 定义一个全局的Uservar globalUser = User { "xiaoming", 28,}// modifyUser 定义一个函数,参数为User结构体“对象”,将全局globalUser指向传递过来的User结构体“对象”func modifyUser(user User) { fmt.Printf("参数user的地址 = %p\n",&user) fmt.Printf("globalUser修改前的地址 = %p\n",&globalUser) fmt.Println("globalUser修改前 = ",globalUser) // 修改指向 globalUser = user fmt.Printf("globalUser修改后的地址 = %p\n",&globalUser) fmt.Println("globalUser修改后 = ",globalUser)}func main() { var u User = User { "xiaohong", 29, } fmt.Printf("将要传递的参数u的地址 = %p\n",&u) modifyUser(u)}// 执行结果将要传递的参数u的地址 = 0xc0000ac018参数user的地址 = 0xc0000ac030globalUser修改前的地址 = 0x113a270globalUser修改前 = {xiaoming 28}globalUser修改后的地址 = 0x113a270globalUuser修改后 = {xiaohong 29}class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public int getAge() {return age;}public String print() {return "{name = " + name + ",age = " + age + "}";}}public class Demo {private static User globalUser = new User("xiaoming",28);public static void modifyUser(User user) {System.out.println("参数globalUser的地址 = " + user);System.out.println("globalUser修改前的地址 = " + globalUser);System.out.println("globalUser修改前 = " + globalUser.print());globalUser = user;System.out.println("globalUser修改后的地址 = " + globalUser);System.out.println("globalUser修改后 = " + globalUser.print());}public static void main(String[] args) {User user = new User("xiaohong", 29);System.out.println("将要传递的参数user的地址 = " + user);modifyUser(user);}}//执行结果将要传递的参数user的地址 = com.example.demo.User@5abca1e0参数globalUser的地址 = com.example.demo.User@5abca1e0globalUser修改前的地址 = com.example.demo.User@2286778globalUser修改前 = {name = xiaoming,age = 28}globalUser修改后的地址 = com.example.demo.User@5abca1e0globalUser修改后 = {name = xiaohong,age = 29}
// User 定义User结构体type User struct {Name stringAge int}func main() {p1 := User{Name: "xiaohong",Age: 21,}changePerson(p1)fmt.Println(p1.Name) // xiaohongchangePersonByPointer(&p1)fmt.Println(p1.Name) // xiaoming}func changePersonByPointer(user *User) {user.Name = "xiaoming"}func changePerson(user User) {user.Name = "xiaoming"}
public class Demo {public static void changePerson(User user) {user.setName("xiaoming");}public static void main(String[] args) {User user = new User("xiaohong", 29);changePerson(user);System.out.println("user信息:" + user.getName()); // xiaoming}}class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public int getAge() {return age;}}
02
public abstract class Animal {String name;int age;}public class Dog extends Animal {public void bark() {System.out.println(age + "岁的" + name + "在汪汪叫");}}public class Demo {public static void main(String[] args) {Dog dog = new Dog();dog.name = "小龙";dog.age = 2;dog.bark(); // 2岁的小龙在汪汪叫}}
package mainimport "fmt"type Animal struct {Name stringAge int}type Dog struct {*Animal}func (dog *Dog) Bark() {fmt.Printf("%d岁的%s在汪汪叫", dog.Age, dog.Name)}func main() {dog := &Dog{&Animal{Name: "小龙",Age: 2,}}dog.Bark() // 2岁的小龙在汪汪叫...}
public interface Dog {void Bark();}public class DogImpl implements Dog{@Overridepublic void Bark() {System.out.println("汪汪叫");}}public class Demo {public static void main(String[] args) {Dog dog = new DogImpl();dog.Bark(); // 汪汪叫}}
package entitytype Factory interface {Produce() boolConsume() bool}type CarFactory struct {ProductName string}func (c *CarFactory) Produce() bool {fmt.Printf("CarFactory生产%s成功", c.ProductName)return true}func (c *CarFactory) Consume() bool {fmt.Printf("CarFactory消费%s成功", c.ProductName)return true}// --------------package mainfunc main() {factory := &entity.CarFactory{"Car"}doProduce(factory)doConsume(factory)}func doProduce(factory entity.Factory) bool {return factory.Produce()}func doConsume(factory entity.Factory) bool {return factory.Consume()}
03
public class ExceptionTest {public static void main(String[] args) {FileInputStream fileInputStream = null;try{fileInputStream = new FileInputStream("test.txt");}catch (IOException e){System.out.println(e.getMessage());e.printStackTrace();return;}finally {if(fileInputStream!=null){try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("回收资源");}}}
func main() {value, err := Bark()if err != nil {// 返回了异常,进行处理log.error("...异常:", err)return err}// Bark方法执行正确,继续执行后续代码Process(value)}
defer func() {// 清理工作} ()// 这是传递参数给匿名函数时的写法var num := 1defer func(num int) {// 做你复杂的清理工作} (num)
defer fmt.Println(a)defer fmt.Println(b)defer fmt.Println(c)执行结果:cba
func main() {fmt.Println("main begin")// 必须要先声明defer,否则不能捕获到panic异常defer func() {fmt.Println("defer begin")if err := recover(); err != nil {// 这里的err其实就是panic传入的内容fmt.Println(err)}fmt.Println("defer end")}()test()// test中出现错误,这里开始下面代码不会再执行fmt.Println("main end")}func test() {fmt.Println("test begin")panic("error")//这里开始下面代码不会再执行fmt.Println("test end")}//执行结果main begintest begindefer beginerrordefer end
04
Runnable task = ()-> System.out.println("task running");Thread t = new Thread(task);t.start();
Runnable task = ()-> System.out.println("task running");Executor executor = Executors.newCachedThreadPool();executor.execute(task);
go func() {fmt.Println("test task running")}()
public void method(){synchronized(this) {// todo some thing}}
public synchronized void method(){// todo some thing}
public synchronized static void method() {// todo some thing}
class DemoClass {public void method() {synchronized(DemoClass.class) {// todo some thing}}}
func main() {var mutex sync.Mutexcount := 0for i := 0; i < 100; i++ {go func() {mutex.Lock() // 加锁count += 1mutex.Unlock() // 解锁}()}// 休眠,等待2stime.Sleep(time.Second * 2)// 100,没有加锁结果不正确fmt.Println("count = ", count)}
type count struct {lock sync.Mutexvalue int}// 结构体对应的结构方法func (receiver *count) countOne() {receiver.lock.Lock()defer receiver.lock.Unlock()receiver.value++}func main() {c := count{lock: sync.Mutex{},value: 0,}group := sync.WaitGroup{}for i := 0; i < 10; i++ {group.Add(1)go func(count2 *count) {defer group.Done()for i := 0; i < 100; i++ {count2.countOne()}}(&c)}group.Wait()fmt.Printf("The count value is %d", c.value) // The count value is 1000}
func main() {var once = sync.Once{}f := func() {time.Sleep(10 * time.Millisecond)fmt.Println("do once")}go func() {fmt.Println("do once start")once.Do(f)fmt.Println("do once finish")}()time.Sleep(1 * time.Millisecond)for i := 0; i < 2; i++ {go func() {fmt.Println("block...")once.Do(f)fmt.Println("resume")}()}time.Sleep(10 * time.Millisecond)}//~do once startblock...block...do oncedo once finishresumeresume
//懒汉式单例类.在第一次调用的时候实例化自己public class Singleton {private Singleton() {}private static Singleton single=null;//静态工厂方法public static synchronized Singleton getInstance() {if (single == null) {single = new Singleton();}return single;}}
//饿汉式单例类.在类初始化时,已经自行实例化public class Singleton {private Singleton() {}private static final Singleton single = new Singleton();//静态工厂方法public static Singleton getInstance() {return single;}}
05
程序开始时有黑白灰三个集合,初始时所有对象都是白色; 从 root 对象开始标记,将所有可达对象标记为灰色; 从灰色对象集合取出对象,将其引用对象标记为灰色,放入灰色集合,并将自己标记为黑色; 重复第三步,直到灰色集合为空,即所有可达对象全部都被标记; 标记结束后,不可达白色对象即为垃圾,对内存进行迭代清扫,回收白色对象; 重置 GC 状态;
06
07
Java 在生态这方面简直是无敌的存在,这主要得益于 Spring 全家桶,Spring 让 Java 走上了神座。Golang 语言知名的框架也很多,但是远远没有 Spring 影响那么大。
| 优点 | 缺点 | |
| Golang | 代码简洁性 静态类型可编译成机器码直接运行 天生多核并行 垃圾收集 跨平台且不依赖运行时环境 简洁的泛型 | 有限的库支持 泛型不够完善 灵活度没Java高(这个可算优点也可算缺点) |
| java | 优秀的生态 优秀的三方库 多线程 灵活性高 平台独立性 完善的语言特性 代码结构层次清晰 | 大量冗余的陈旧实现导致性能不佳 生态的复杂性 复杂的继承机制 |
Java 和 GO 哪个用的比较多,说说你对这两个语言的看法?欢迎评论留言。我们将选取1则优质的评论,送出腾讯云定制文件袋套装1个(见下图)。3月25日中午12点开奖。
📢📢欢迎加入腾讯云开发者社群,享前沿资讯、大咖干货,找兴趣搭子,交同城好友,更有鹅厂招聘机会、限量周边好礼等你来~
(长按图片立即扫码)
📢📢对 DeepSeek 的技术原理、部署教程、应用实践感兴趣的小伙伴,也可以扫下方二维码加入腾讯云官方 DeepSeek 交流群,不定时输出鹅厂大佬的实战教学!