เคล็ดลับสำหรับการเล่นกอล์ฟในโก


25

คุณมีเคล็ดลับทั่วไปสำหรับการเล่นกอล์ฟในโก ฉันยังใหม่กับ Code Golfing และกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหาของรหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ Go

โปรดเก็บไว้หนึ่งเคล็ดลับต่อคำตอบ


3
เราอาจต้องการสร้างGoแท็ก แต่จากนั้น Go ใช้เพื่อตีกอล์ฟที่นี่หรือไม่
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ฉันใช้เพื่อ
cat

3
ควรเปลี่ยนชื่อเป็น "Tips for Go-lfing"
Uriel

คำตอบ:


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อยู่ใน namespace ทั่วโลก นอกจากนี้คุณไม่จำเป็นต้องใช้เครื่องหมายอัฒภาค เคยยกเว้นว่าคุณมีข้อความสั่งหลายรายการในบรรทัด
cat

โปรดทราบว่าใน Golang เครื่องมือจัดฟันต้องอยู่ในบรรทัดเดียวกันเนื่องจากการใส่เครื่องหมายอัฒภาคโดยอัตโนมัติ ข้อมูลเพิ่มเติม: golang.org/doc/faq#semicolons
แมว

7

ค่าส่งคืนที่มีชื่อสามารถบันทึกได้สองสามไบต์ ตัวอย่างเช่น:

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

คุณสามารถบันทึกได้ 3 ไบต์ด้วย

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

มันมีประโยชน์มากขึ้นถ้าคุณต้องการประกาศตัวแปรหลาย ๆ ตัวที่จุดเริ่มต้นของฟังก์ชันของคุณ


7

หากคุณต้องการเปรียบเทียบค่าที่แตกต่างจำนวนมากกับค่าเดียวมันอาจจะประหยัดพื้นที่ในการใช้ a 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)

การแปลงสตริงจาก Int: (จำกัด แต่บางครั้งก็มีประโยชน์)

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มีเพียงเพื่อแสดงสิ่งที่รหัสกอล์ฟจะเป็นรหัสปกติ
Benny Jobigan

2

คอมไพเลอร์ Go มีกำหนดไว้ล่วงหน้า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

ใช้ประโยชน์จากฟังก์ชั่นชั้นหนึ่งของ Go โดยการกำหนดชื่อฟังก์ชันไลบรารีแบบยาวให้กับตัวแปรตัวอักษรหนึ่งตัว

import."strings"
r:=Replace
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.