गो में गोल्फिंग के लिए टिप्स


25

गो में गोल्फिंग के लिए आपके पास क्या सामान्य सुझाव हैं? मैं कोड गोल्फिंग के लिए नया हूं और उन विचारों की तलाश कर रहा हूं जो सामान्य रूप से कोड गोल्फ समस्याओं के लिए लागू किए जा सकते हैं जो कम से कम गो के लिए कुछ विशिष्ट हैं।

कृपया प्रति उत्तर एक टिप रखें।


3
हम Goटैग बनाना चाहते हैं , लेकिन फिर, क्या गो यहां भी गोल्फ के लिए इस्तेमाल किया जा रहा है?
ऑप्टिमाइज़र

@Optimizer मैं करने के लिए इस्तेमाल
बिल्ली

3
"गो-lfing के लिए युक्तियाँ" के लिए शीर्षक का नाम बदलने चाहिए
ऊरीएल

जवाबों:


12

यहाँ @ EMBLEM के उत्तर से प्रेरित है ।

जब आप उन्हें आयात करते हैं तो आप वैश्विक नामस्थान में पैकेज के कार्य कर सकते हैं:

package main

import ."fmt"

func main() {
    Printf("Hello World!")
}

9

जब आप उन्हें आयात करते हैं तो आप पैकेजों को नाम दे सकते हैं

package main

import f "fmt"

func main() {
    f.Printf("Hello World\n")
}

यहाँ यह सीखा ।


3
आप भी कर सकते हैं import ."fmt"और फिर Printlnऔर बाकी के fmtकार्य वैश्विक नामस्थान में हैं। इसके अलावा, आपको अर्धविराम की आवश्यकता नहीं है। जब तक आपके पास एक लाइन पर कई कथन नहीं हैं
बिल्ली

ध्यान दें कि गोलंग में, स्वचालित अर्धविराम सम्मिलन के कारण ब्रेसिज़ को एक ही लाइन पर जाना चाहिए । और जानकारी: golang.org/doc/faq#semicolons
बिल्ली

7

नामित रिटर्न मान कुछ बाइट्स बचा सकते हैं। उदाहरण के लिए:

func x()string{
r:="" //Do stuff
return r}

आप के साथ 3 बाइट्स बचा सकते हैं

func x()(r string){
//Do stuff
return}

यदि आपको अपने फ़ंक्शन के प्रारंभ में कई चर घोषित करने की आवश्यकता है तो यह अधिक उपयोगी है।


7

यदि आपको किसी एक से कई अलग-अलग मूल्यों की तुलना करने की आवश्यकता है, तो switchएकल केस के साथ उपयोग करने के लिए अधिक स्थान-कुशल हो सकता है ।

if x==1||x==2||x==3||x==4{}
switch x{case 1,2,3,4:}

2

एकाधिक चर घोषित करना:

i,s:=0,""

var(i int;s string)

स्ट्रिंग से रूपांतरण: (सीमित लेकिन कभी-कभी मददगार)

n:=byte("9"[0])-48 // actual type is uint8

n,_:=strconv.Atoi("9")

और इसके विपरीत

s:=string(9+48)

s:=strconv.Itoa(9)

fmt.Sprintबाइट्स को बचाने की संभावना है strconv.Atoi, क्योंकि आपने पहले fmtही आयात कर लिया है ।
EMBLEM

@EMBLEM मुझे लगता है strconvकि गोल्फ-कोड सामान्य कोड में क्या होगा, यह दिखाने के लिए ही था।
बेनी जोबिगन

2

गो संकलक को पूर्वनिर्धारित किया गया है printऔर ऐसे printlnकार्यों के लिए जिसे fmt आयात करने की आवश्यकता नहीं है, इसलिए इसके बजाय।

package main
import."fmt"
func main(){Printf(`Hello World
`)}

आप यह लिख सकते हैं।

package main
func main(){print(`Hello World
`)}

ध्यान दें कि यह STDERR को आउटपुट करता है।


1

रेंज लूप के लिए बहुत सारा सामान वैकल्पिक है।

मानक वर्ज़न:

for i,v:=range a{
// Do stuff
}

यदि i, vपहले से ही परिभाषित किया गया है और अधिलेखित किया जा सकता है:

for i,v=range a{
// Do stuff
}

यदि आपको मूल्य की परवाह नहीं है:

for i:=range a{
// Do stuff
}

यदि आप मूल्य के बारे में परवाह नहीं करते हैं और iपहले से ही परिभाषित किया गया है:

for i=range a{
// Do stuff
}

यदि आप सूचकांक या मूल्य की परवाह नहीं करते हैं:

for range a{
// Do stuff
}

यदि आप एक अनंत लूप चाहते हैं:

for{
// Do stuff
}

1

एक नई पंक्ति को शामिल करने के लिए एक स्ट्रिंग की आवश्यकता है? लिखो मत \n, backquotes के साथ एक कच्ची स्ट्रिंग बनाएं और इसमें एक शाब्दिक नई पंक्ति डालें।

s:="\n" // 7 bytes
s:=`
` // 6 bytes

0

आप किसी भी खुलने वाले ब्रेसिज़ को एक पंक्ति में रख सकते हैं, लेकिन एक पंक्ति जिसमें खुलने वाले ब्रेसिज़ होते हैं, उसमें अधिकतम एक ब्रेसिंग ब्रेस हो सकता है।

सही बात:

func main(){if true{switch{case 1==1:for{break
}}}}

यह भी सही:

func main(){if true{switch{case 1==1:for{break}
}}}

यह भी सही:

func main(){if true{switch{case 1==1:for{
break}}}}

गलत:

func main() {
    if true{for{break}}
}

0

जाओ बिट के संचालन के लिए अलग ऑपरेटर पूर्वता है, <<, >>, &, आदि आम तौर पर कम पूर्वता से है +और -अधिकांश भाषाओं में है, लेकिन जाने में वे के रूप में ही पूर्वता है *और /

Precedence    Operator
5             *  /  %  <<  >>  &  &^
4             +  -  |  ^
3             ==  !=  <  <=  >  >=
2             &&
1             ||

इसका उपयोग कुछ कोष्ठकों को बचाने के लिए किया जा सकता है।

अधिकांश भाषाएँ:

(a&b)*c

चले जाओ:

a&b*c

0

एक-अक्षर वाले चरों के लिए लंबे लाइब्रेरी फ़ंक्शन नाम निर्दिष्ट करके गो के प्रथम श्रेणी के कार्यों का पूरा उपयोग करें।

import."strings"
r:=Replace
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.